Jump to content

Combine 32 & 64 Reg values


Recommended Posts

Hi everyone, 

I'm currently writing a script that allow me to list all currently installed software on a computer but some of the are listed in the HKLM64 hive of the registry whereas 95% of all others are in the HKLM "normal" one.

Thing is, I'd like to combine these two reg key into one single ListView item.

Here's my code so far, knowing that it's working on both cases (changing to HKLM64 or HKLM short)

Spoiler
#include <GuiListView.au3>
Opt("TrayAutoPause", 0)
Opt('GUIOnEventMode', 1)
Opt('GUICloseOnEsc' , 1)

Global $i
Local $sSft
Global $sGui = GUICreate('Currently Installed Software', 810, 650, -1, -1)
Global $sLvw = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600)
_ComputerGetSoftware($sSft)

For $i = 1 To ubound($sSft) - 1
    GUICtrlCreateListViewItem($i & '|' & $sSft[$i][0] & '|' & $sSft[$i][1] & '|' & $sSft[$i][2] & '|' & $sSft[$i][3], $sLvw)
Next

GUICtrlSendMsg($sLvw, 0x101E, 1, 175)
GUICtrlSendMsg($sLvw, 0x101E, 2, 65)
GUICtrlSendMsg($sLvw, 0x101E, 3, 150)
GUICtrlSendMsg($sLvw, 0x101E, 4, 350)
Local $mMen = GUICtrlCreateContextMenu($sLvw)
Local $Uninstall = GUICtrlCreateMenuItem('Proceed to Software uninstallation', $mMen)
GUICtrlSetOnEvent($Uninstall, '_Uninstall')
Local $exp = GUICtrlCreateButton('  Expand  ', 720, 615)
GUICtrlSetOnEvent($exp, '_Expand')
GUISetOnEvent(-3, '_AllExit')
GUISetState(@SW_SHOW, $sGui)

While 1
    Sleep(10)
WEnd
;
Func _AllExit()
    GUIDelete($sGui)
    Exit
EndFunc

Func _Uninstall()
   Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($sLvw)), '|', 1)
   If $proc[1] == 0 Then Return -1
   ShellExecuteWait ($proc[5])
EndFunc

Func _ComputerGetSoftware(ByRef $aSoftwareInfo)
    Local Const $UnInstKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $i = 1
    Dim $aSoftwareInfo[1][4]
        For $j = 1 To 500
            $AppKey = RegEnumKey($UnInstKey, $j)
            If @error <> 0 Then Exitloop
            If RegRead($UnInstKey & "\" & $AppKey, "DisplayName") = '' Then ContinueLoop
            ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4]
            $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
            $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
            $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
            $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
            $i = $i + 1
        Next
        $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
        If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0)
        Return _ArraySort($aSoftwareInfo,0,1)
        For $j = 1 To 500
            $AppKey = RegEnumKey($UnInstKey, $j)
            If @error <> 0 Then Exitloop
            $Reg = RegRead($UnInstKey & "\" & $AppKey, "DisplayName")
            $string = stringinstr($Reg, $input)
            If $string = 0 Then Continueloop
            ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4]
            $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
            $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
            $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
            $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
            $i = $i + 1
        Next
        $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
        If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0)
        Return _ArraySort($aSoftwareInfo,0,1)
EndFunc
;
Func _Expand()
    _GUICtrlListView_SetColumnWidth($sLvw, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($sLvw, 2, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($sLvw, 3, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($sLvw, 4, $LVSCW_AUTOSIZE)
EndFunc

 

Thanks in advance for the help :)

-31290-

~~~ Doom Shall Never Die, Only The Players ~~~

Link to comment
Share on other sites

change your function that reads the reg. pass it the key once for 32 bit, once for 64 in main loop

Func _ComputerGetSoftware(ByRef $aSoftwareInfo, $UnInstKey)

then don;t do this, remark that out.

 Local Const $UnInstKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

pass that key to your function 2 times, 32 and 64 values and add them to the one array.

Edited by Earthshine

My resources are limited. You must ask the right questions

 

Link to comment
Share on other sites

12 minutes ago, Earthshine said:

by the way, your code doesn't compile so i'm not going to test it.

What do you mean by that? I've just compiled it and ran just fine.

Thanks for your info above, I'll test that.

-31290-

~~~ Doom Shall Never Die, Only The Players ~~~

Link to comment
Share on other sites

Maybe something like:

#include <GuiListView.au3>
Opt("TrayAutoPause", 0)
Opt('GUIOnEventMode', 1)
Opt('GUICloseOnEsc' , 1)

Global $aSoftwareInfo[0][5]
    _SoftwareInfo("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
    _SoftwareInfo("HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")

Global $hGui = GUICreate('Currently Installed Software', 810, 650, -1, -1)
Global $idListView = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600)
_GUICtrlListView_AddArray($idListView, $aSoftwareInfo)

GUICtrlSendMsg($idListView, 0x101E, 1, 175)
GUICtrlSendMsg($idListView, 0x101E, 2, 65)
GUICtrlSendMsg($idListView, 0x101E, 3, 150)
GUICtrlSendMsg($idListView, 0x101E, 4, 350)
Local $mMen = GUICtrlCreateContextMenu($idListView)
Local $Uninstall = GUICtrlCreateMenuItem('Proceed to Software uninstallation', $mMen)
GUICtrlSetOnEvent($Uninstall, '_Uninstall')
Local $exp = GUICtrlCreateButton('  Expand  ', 720, 615)
GUICtrlSetOnEvent($exp, '_Expand')
GUISetOnEvent(-3, '_AllExit')
GUISetState(@SW_SHOW, $hGui)

While 1
    Sleep(10)
WEnd
;
Func _AllExit()
    GUIDelete($hGui)
    Exit
EndFunc

Func _Uninstall()
   Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($idListView)), '|', 1)
   If $proc[1] == 0 Then Return -1
   ShellExecuteWait ($proc[5])
EndFunc

Func _SoftwareInfo($_sHKLMUninstall)
    Local $i = 1
    While 1
        $sRegKey = RegEnumKey($_sHKLMUninstall, $i)
        If @error Then Exitloop
        If RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName") = '' Then
            $i += 1
            ContinueLoop
        EndIf
        $sDisplayName = StringStripWS(StringReplace(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName"), " (remove only)", ""), 3)
        $sDisplayVersion = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayVersion"), 3)
        $sPublisher = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "Publisher"), 3)
        $sUninstallString = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "UninstallString"), 3)
        _ArrayAdd($aSoftwareInfo, "|" & $sDisplayName & "|" & $sDisplayVersion & "|" & $sPublisher & "|" & $sUninstallString)
        $i += 1
    WEnd
    _ArraySort($aSoftwareInfo,0,1)
    For $i = 0 To UBound($aSoftwareInfo) - 1
        $aSoftwareInfo[$i][0] = $i
    Next
EndFunc
;
Func _Expand()
    _GUICtrlListView_SetColumnWidth($idListView, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($idListView, 2, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($idListView, 3, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($idListView, 4, $LVSCW_AUTOSIZE)
EndFunc

 

Link to comment
Share on other sites

"HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

 

AutoItScript List installed programs and system information:

#include <GuiListView.au3>
Opt("TrayAutoPause", 0)
Opt('GUIOnEventMode', 1)
Opt('GUICloseOnEsc', 1)
;Opt("MustDeclareVars", 1)
;
Global $SoftwList = 'ALL', $iAskSoftName = 0, $sSft[1][0]
Global $sGui = GUICreate('Currently Installed Software', 810, 650, -1, -1)
Global $sLvw = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600)
_ComputerGetSoftware($sSft)
For $i = 1 To UBound($sSft) - 1
    GUICtrlCreateListViewItem($i & '|' & $sSft[$i][0] & '|' & $sSft[$i][1] & '|' & $sSft[$i][2] & '|' & $sSft[$i][3], $sLvw)
Next
GUICtrlSendMsg($sLvw, 0x101E, 1, 175)
GUICtrlSendMsg($sLvw, 0x101E, 2, 65)
GUICtrlSendMsg($sLvw, 0x101E, 3, 150)
GUICtrlSendMsg($sLvw, 0x101E, 4, 350)
Global $mMen = GUICtrlCreateContextMenu($sLvw)
Global $CopI = GUICtrlCreateMenuItem('Uninstall Current Selection', $mMen)
GUICtrlSetOnEvent($CopI, '_Uninstall')
Global $exp = GUICtrlCreateButton('  Expand  ', 720, 615)
GUICtrlSetOnEvent($exp, '_Expand')
GUISetOnEvent(-3, '_AllExit')
GUISetState(@SW_SHOW, $sGui)
;
While 1
    Sleep(10)
WEnd
;
Func _AllExit()
    GUIDelete($sGui)
    Exit
EndFunc   ;==>_AllExit
;
Func _Uninstall()
    Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($sLvw)), '|', 1)
    If $proc[1] == 0 Then Return -1
    If $proc[5] Then RunWait($proc[5])
    Exit
EndFunc   ;==>_Uninstall
;
Func _Copy2Clip()
    Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($sLvw)), '|', 1)
    If $proc[1] == 0 Then Return -1
    If $proc[5] Then ClipPut($proc[5])
EndFunc   ;==>_Copy2Clip
;
; Author JSThePatriot - Modified June 20, 2010 by ripdad - Modified 2018/29/05 by Dao Van Trong - Trong.LIVE
Func _ComputerGetSoftware(ByRef $aSoftwareInfo)
    Local Const $UnInstKey = "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $i = 1, $Reg, $string, $AppKey
    ReDim $aSoftwareInfo[1][4]
    If ($iAskSoftName) Then $SoftwList = InputBox("Which Software", "You are running " & @OSVersion & " " & @OSArch & @CRLF & @CRLF & "Which Software would you like to view?", 'ALL')
    If @error = 1 Then Exit
    If $SoftwList = 'ALL' Then
        For $j = 1 To 500
            $AppKey = RegEnumKey($UnInstKey, $j)
            If @error <> 0 Then ExitLoop
            If RegRead($UnInstKey & "\" & $AppKey, "DisplayName") = '' Then ContinueLoop
            ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4]
            $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
            $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
            $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
            $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
            $i = $i + 1
        Next
        $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
        If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0)
        Return _ArraySort($aSoftwareInfo, 0, 1)
    Else
        For $j = 1 To 500
            $AppKey = RegEnumKey($UnInstKey, $j)
            If @error <> 0 Then ExitLoop
            Local $Reg = RegRead($UnInstKey & "\" & $AppKey, "DisplayName")
            $string = StringInStr($Reg, $SoftwList)
            If $string = 0 Then ContinueLoop
            ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4]
            $aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
            $aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
            $aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
            $aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
            $i = $i + 1
        Next
        $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
        If $aSoftwareInfo[0][0] < 1 Then SetError(1, 1, 0)
        Return _ArraySort($aSoftwareInfo, 0, 1)
    EndIf
EndFunc   ;==>_ComputerGetSoftware
;
Func _Expand()
    _GUICtrlListView_SetColumnWidth($sLvw, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($sLvw, 2, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($sLvw, 3, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($sLvw, 4, $LVSCW_AUTOSIZE)
EndFunc   ;==>_Expand

 

Edited by VIP
;

Regards,
 

Link to comment
Share on other sites

@VIP > Thanks for your input but I was talking about combining HKLM64 & HKLM ;) 

@Subz > Your example is just what I've expected! thanks a lot. Now I can figure out how to achieve that!

@Earthshine > Thanks again for your help!

Edited by 31290

~~~ Doom Shall Never Die, Only The Players ~~~

Link to comment
Share on other sites

1 minute ago, VIP said:

You can not combine it! You need to read or write it 2 times!
For examples (List installed programs) just add "64" is enough!

Here I meant combining the 2 reg. keys in the same array :P 
But no worries, question has been answered by subz and I can go on with the tool I'm writing :) 

~~~ Doom Shall Never Die, Only The Players ~~~

Link to comment
Share on other sites

@Subz and others

Sorry to bother again but I need you help again.

I'm now facing another thing which is that I cannot retrieve the uninstall key string.

I just don't understand why my _Uninstall() function is not working:
 

Func _Uninstall()
   Local $proc = StringSplit(GUICtrlRead(GUICtrlRead($idListView)), '|', 1)
   If $proc[1] == 0 Then Return -1
   Msgbox (0, "", $proc[5])
EndFunc

Nothing simply happens.
When displaying the $proc array, I just have two values, 0 & 1 :/

Then main goal here is to retrieve the uninstall sting displayed in the ListView.

Full code so far:

 

Spoiler
#include <GuiListView.au3>
Opt("TrayAutoPause", 0)
Opt('GUIOnEventMode', 1)
Opt('GUICloseOnEsc' , 1)

Global $aSoftwareInfo[0][5]
    _SoftwareInfo("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
    _SoftwareInfo("HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")

Global $hGui = GUICreate('Currently Installed Software', 810, 650, -1, -1)
Global $idListView = GUICtrlCreateListView('#|Installed Software|Display Version|Publisher|Uninstall String', 5, 5, 800, 600)
_GUICtrlListView_AddArray($idListView, $aSoftwareInfo)

GUICtrlSendMsg($idListView, 0x101E, 1, 175)
GUICtrlSendMsg($idListView, 0x101E, 2, 65)
GUICtrlSendMsg($idListView, 0x101E, 3, 150)
GUICtrlSendMsg($idListView, 0x101E, 4, 350)
Local $mMen = GUICtrlCreateContextMenu($idListView)
Local $Uninstall = GUICtrlCreateMenuItem('Proceed to Software uninstallation', $mMen)
GUICtrlSetOnEvent($Uninstall, '_Uninstall')
Local $exp = GUICtrlCreateButton('  Expand  ', 720, 615)
GUICtrlSetOnEvent($exp, '_Expand')
GUISetOnEvent(-3, '_AllExit')
GUISetState(@SW_SHOW, $hGui)

While 1
    Sleep(10)
WEnd
;
Func _AllExit()
    GUIDelete($hGui)
    Exit
EndFunc

Func _Uninstall()
   Local $proc = StringSplit((GUICtrlRead($aSoftwareInfo)), '|', 1)
   _arraydisplay ($proc)
   ; Msgbox (0, "", $proc[5])
EndFunc

Func _SoftwareInfo($_sHKLMUninstall)
    Local $i = 1
    While 1
        $sRegKey = RegEnumKey($_sHKLMUninstall, $i)
        If @error Then Exitloop
        If RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName") = '' Then
            $i += 1
            ContinueLoop
        EndIf
        $sDisplayName = StringStripWS(StringReplace(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayName"), " (remove only)", ""), 3)
        $sDisplayVersion = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "DisplayVersion"), 3)
        $sPublisher = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "Publisher"), 3)
        $sUninstallString = StringStripWS(RegRead($_sHKLMUninstall & "\" & $sRegKey, "UninstallString"), 3)
        _ArrayAdd($aSoftwareInfo, "|" & $sDisplayName & "|" & $sDisplayVersion & "|" & $sPublisher & "|" & $sUninstallString)
        $i += 1
    WEnd
    _ArraySort($aSoftwareInfo,0,1)
    For $i = 0 To UBound($aSoftwareInfo) - 1
        $aSoftwareInfo[$i][0] = $i
    Next
EndFunc
;
Func _Expand()
    _GUICtrlListView_SetColumnWidth($idListView, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($idListView, 2, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($idListView, 3, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($idListView, 4, $LVSCW_AUTOSIZE)
EndFunc

 

Thanks in advance :)

-31290-

~~~ Doom Shall Never Die, Only The Players ~~~

Link to comment
Share on other sites

Well, thanks again Subz.

I was beginning playing around with _GUICtrlListView_XXX functions.

But yours is faster and efficient.

You have a good day Sir :) 

~~~ Doom Shall Never Die, Only The Players ~~~

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...