Автор Тема: Получение названия установленной программы в окне  (Прочитано 16016 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
joiner, надо компилировать скрипт под 2 версии х32 и х64. И на Winx64 проверять 2 ветки.
В х64 версии скрипта при проверки ветки
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstallбудет возвращен список установленных программ х64
и при проверки ветки
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstallбудет возвращен список установленных программ х32.
В случае запуска версии скрипта х32 на Winx64 результат возврата будет одинаковым, список установленных программ х32. Т.к. идет перенаправление ветки HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
И для полной картины установленных программ надо проверять еще ветку
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
« Последнее редактирование: Октябрь 20, 2012, 10:47:53 от glax24 »

Русское сообщество AutoIt

Re: Получение названия установленной программы в окне
« Ответ #15 Отправлен: Октябрь 20, 2012, 10:30:30 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
указать какая система можно в самом скрипте. то есть согласно справке : HKLM64
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall
результат возвращался пустой
Не пробовал, может надо было использовать DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
« Последнее редактирование: Октябрь 20, 2012, 12:22:50 от glax24 »

Оффлайн ivsatel [?]

  • Продвинутый
  • ***
  • Сообщений: 319
  • Репутация: 84
  • Пол: Мужской
    • Награды
glax24

Можно как-то так:
Код: AutoIt [Выделить]
If @OSArch = 'x64' Then
    Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
    Global $Path2 = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
    Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
Else
    Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
    Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
EndIf
 

Но вот как это реализовать...

Русское сообщество AutoIt

Re: Получение названия установленной программы в окне
« Ответ #18 Отправлен: Октябрь 20, 2012, 12:15:30 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Код: AutoIt [Выделить]
#Include <Array.au3>

Dim  $aSoftwareInfo
Dim  $aSoftwareInfo64
Dim  $aSoftwareInfo_all
_ComputerGetSoftware($aSoftwareInfo)
_ComputerGetSoftware64($aSoftwareInfo64)
_ComputerGetSoftware_all($aSoftwareInfo_all)

If @OSArch = "X86" Then
    _ArrayDisplay($aSoftwareInfo,'X86')
    _ArrayDisplay($aSoftwareInfo_all)
    Exit
    Else
_ArrayDisplay($aSoftwareInfo,'X86')
_ArrayDisplay($aSoftwareInfo64,'X64')
_ArrayDisplay($aSoftwareInfo_all)
EndIf

Func _ComputerGetSoftware64(ByRef $aSoftwareInfo64)
    Local Const $UnInstKey64  = "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $i = 1
    Dim $aSoftwareInfo64[1][4]
    While 1
        $AppKey64 = RegEnumKey($UnInstKey64, $i)
        If @error <> 0 Then ExitLoop
        ReDim $aSoftwareInfo64[UBound($aSoftwareInfo64) + 1][4]
        $aSoftwareInfo64[$i][0]   = StringStripWS(StringReplace(RegRead($UnInstKey64 & "\" & $AppKey64, "DisplayName"), " (remove only)", ""), 3)
        $aSoftwareInfo64[$i][1]   = StringStripWS(RegRead($UnInstKey64 & "\" & $AppKey64, "DisplayVersion"), 3)
        $aSoftwareInfo64[$i][2]   = StringStripWS(RegRead($UnInstKey64 & "\" & $AppKey64, "Publisher"), 3)
        $aSoftwareInfo64[$i][3]   = StringStripWS(RegRead($UnInstKey64 & "\" & $AppKey64, "UninstallString"), 3)
        $i += 1
    WEnd
    $aSoftwareInfo64[0][0] = UBound($aSoftwareInfo64, 1) - 1
    If $aSoftwareInfo64[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
EndFunc

Func _ComputerGetSoftware(ByRef $aSoftwareInfo)
    Local Const $UnInstKey  = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Local $i = 1
    Dim $aSoftwareInfo[1][4]
    While 1
        $AppKey = RegEnumKey($UnInstKey, $i)
        If @error <> 0 Then ExitLoop
        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 += 1
    WEnd
    $aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
    If $aSoftwareInfo[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
EndFunc

Func _ComputerGetSoftware_all(ByRef $aSoftwareInfo_all)
    Local Const $UnInstKey_all  = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
    Local $i = 1
    Dim $aSoftwareInfo_all[1][4]
    While 1
        $AppKey_all= RegEnumKey($UnInstKey_all, $i)
        If @error <> 0 Then ExitLoop
        ReDim $aSoftwareInfo_all[UBound($aSoftwareInfo_all) + 1][4]
        $aSoftwareInfo_all[$i][0]   = StringStripWS(StringReplace(RegRead($UnInstKey_all & "\" & $AppKey_all, "DisplayName"), " (remove only)", ""), 3)
        $aSoftwareInfo_all[$i][1]   = StringStripWS(RegRead($UnInstKey_all & "\" & $AppKey_all, "DisplayVersion"), 3)
        $aSoftwareInfo_all[$i][2]   = StringStripWS(RegRead($UnInstKey_all & "\" & $AppKey_all, "Publisher"), 3)
        $aSoftwareInfo_all[$i][3]   = StringStripWS(RegRead($UnInstKey_all & "\" & $AppKey_all, "UninstallString"), 3)
        $i += 1
    WEnd
    $aSoftwareInfo_all[0][0] = UBound($aSoftwareInfo_all, 1) - 1
    If $aSoftwareInfo_all[0][0] < 1 Then
        SetError(1, 1, 0)
    EndIf
EndFunc

« Последнее редактирование: Октябрь 31, 2012, 02:18:25 от joiner »

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
joiner, вы проверяли что если скрипт откомпилировать в x32 и запустить его на Winх64, вернется правильный результат?

Оффлайн ivsatel [?]

  • Продвинутый
  • ***
  • Сообщений: 319
  • Репутация: 84
  • Пол: Мужской
    • Награды
Так наверное хуже и больше код, но все же:
(нажмите для показа/скрытия)

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
ivsatel, читайте выше моё сообщение.
Код: AutoIt [Выделить]
If @OSArch = 'x64' Then
    Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
    Global $Path2 = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
    Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'

Если скрипт х32 при запуске на Winх64 Path1=Path2

Русское сообщество AutoIt

Re: Получение названия установленной программы в окне
« Ответ #22 Отправлен: Октябрь 20, 2012, 12:44:38 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
если компилировать скрипт по умолчанию как х86 , то показывает как положено в Win 7 x64. сначала установленные 32-битные приложения потом 64-битные. если компилировать скрипт как х64, то показывает только программы 64-битности. 
у меня система Win7  x64

Оффлайн ivsatel [?]

  • Продвинутый
  • ***
  • Сообщений: 319
  • Репутация: 84
  • Пол: Мужской
    • Награды
joiner
У меня Ваш скрипт показывает обе таблицы, система Win ХР х32
Или это по тому, что не скоипилированный?

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
правильно. ведь система ХР х32
можно через проверку
Код: AutoIt [Выделить]
If @OSArch = "X86" Then
    _ArrayDisplay($aSoftwareInfo,'X86')
    Exit
    Else
_ArrayDisplay($aSoftwareInfo,'X86')
_ArrayDisplay($aSoftwareInfo64,'X64')
EndIf


Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
Т.к. мой пример был основан на примере CreatoR, то сделал так
Код: AutoIt [Выделить]
If @OSArch = "X64" Then
        Local $sKey = 'HKLM64\Software\Microsoft\Windows\CurrentVersion\Uninstall\'
        Local $iAccess = BitOR($KEY_READ, $KEY_WOW64_64KEY)
        Local $hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall', $iAccess)
    Else
        Local $sKey = 'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\'
        Local $hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall')
    EndIf


Оффлайн ivsatel [?]

  • Продвинутый
  • ***
  • Сообщений: 319
  • Репутация: 84
  • Пол: Мужской
    • Награды
glax24
Тоже немного сделал:
(нажмите для показа/скрытия)

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
Т.к для чтения из реестра с помощью функций из WinAPIEx скрипт необходимо запускать от имени администратора, то перешел на функции из Registry_UDFs.au3, вот что получилось

Код: AutoIt [Выделить]
#include <Array.au3>

Global $HKCU = 'HKCU', $HKLM = 'HKLM'
Global $sKeyUn
Dim $aProgram[1][3]
$aProgram[0][0] = 0

If @OSArch = "X64" Then
    $HKCU = 'HKCU64'
    $HKLM = 'HKLM64'
EndIf

$sKeyUn = $HKLM & '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
GetInstallProg($sKeyUn)
$sKeyUn = $HKCU & '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
GetInstallProg($sKeyUn)
If @OSArch = "X64" Then
    $sKeyUn = $HKLM & '\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
    GetInstallProg($sKeyUn)
EndIf
_ArrayDisplay($aProgram, "InstallProg")

; Функция получения установленных программ
Func GetInstallProg($sKey)
    Local $errReg = 0
    Local $i = 0
    Local $sDisplayName
    Local $sDisplayVersion
    Local $sUninstallString

    Local $aKey = _RegReadKeyValueToArray($sKey)
    $errReg = @error
    If $errReg Or UBound($aKey) = 0 Then Return SetError(1, 0, "")

    If Not $aKey[0] Then Return SetError(2, 0, "") ; Если раздел $sKey есть, но он пустой

    ReDim $aProgram[$aKey[0] + 1 + $aProgram[0][0]][3]

    For $i = 1 To UBound($aKey) - 1

        $sDisplayName = RegRead($aKey[$i], 'DisplayName')
        $sDisplayVersion = RegRead($aKey[$i], 'DisplayVersion')
        $sUninstallString = RegRead($aKey[$i], 'UninstallString')

        ;If $sDisplayName And $sUninstallString Then
        If $sDisplayName Then

            ; Пропускаем повторяющиеся
            For $j = 1 To $aProgram[0][0]
                If $aProgram[$j][0] = "" Then ContinueLoop
                If StringCompare($aProgram[$j][0], $sDisplayName) = 0 Then
                    ContinueLoop 2
                EndIf
            Next

            $aProgram[0][0] += 1
            $aProgram[$aProgram[0][0]][0] = $sDisplayName
            $aProgram[$aProgram[0][0]][1] = $sDisplayVersion
            $aProgram[$aProgram[0][0]][2] = $sUninstallString

        EndIf
    Next

    ReDim $aProgram[$aProgram[0][0] + 1][3]

EndFunc   ;==>GetInstallProg

;function from Registry_UDFs.au3
Func _RegReadKeyValueToArray($s_Key, $iKey_Value_Mode = 0)
    Local $aKeysListArr[1], $aSubKeysListArr, $iInstance = 0, $sEnum_KeyVal, $sCurrentKeyPath

    If Not _RegKeyExists($s_Key) Then Return SetError(1, 0, $aKeysListArr)

    While 1
        $iInstance += 1

        If $iKey_Value_Mode = 0 Then
            $sEnum_KeyVal = RegEnumKey($s_Key, $iInstance)
        Else
            $sEnum_KeyVal = RegEnumVal($s_Key, $iInstance)
        EndIf

        If @error <> 0 Then ExitLoop

        $sCurrentKeyPath = $s_Key & "\" & $sEnum_KeyVal

        $aKeysListArr[0] += 1
        ReDim $aKeysListArr[$aKeysListArr[0] + 1]
        $aKeysListArr[$aKeysListArr[0]] = $sCurrentKeyPath

        $aSubKeysListArr = _RegReadKeyValueToArray($sCurrentKeyPath)

        For $j = 1 To $aSubKeysListArr[0]
            $aKeysListArr[0] += 1

            ReDim $aKeysListArr[$aKeysListArr[0] + 1]
            $aKeysListArr[$aKeysListArr[0]] = $aSubKeysListArr[$j]
        Next
    WEnd

    Return $aKeysListArr
EndFunc   ;==>_RegReadKeyValueToArray

;function from Registry_UDFs.au3
Func _RegKeyExists($s_Key)
    RegRead($s_Key, "")
    If @error <= 0 Then Return 1 ; Key exists

    Return 0
EndFunc   ;==>_RegKeyExists

« Последнее редактирование: Ноябрь 17, 2012, 23:57:40 от glax24 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2808
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
glax24
не все показывает.  в 64-битной системе нужно использовать и HKLM64 и HKLM

Русское сообщество AutoIt

Re: Получение названия установленной программы в окне
« Ответ #29 Отправлен: Ноябрь 17, 2012, 00:58:18 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
4365 Просмотров
Последний ответ Август 01, 2010, 16:58:13
от assch
8 Ответов
6946 Просмотров
Последний ответ Октябрь 17, 2010, 14:49:36
от Garrett
4 Ответов
2635 Просмотров
Последний ответ Июль 21, 2011, 19:04:31
от yukuru
0 Ответов
1367 Просмотров
Последний ответ Август 16, 2013, 12:43:28
от Talany
1 Ответов
1022 Просмотров
Последний ответ Апрель 29, 2015, 17:54:19
от InnI
11 Ответов
2726 Просмотров
Последний ответ Июнь 03, 2015, 13:01:53
от Yashied
5 Ответов
2345 Просмотров
Последний ответ Июнь 03, 2015, 22:35:20
от Yashied
15 Ответов
5029 Просмотров
Последний ответ Февраль 29, 2016, 00:33:53
от CreatoR
2 Ответов
434 Просмотров
Последний ответ Октябрь 16, 2017, 20:37:32
от OlegSmirnov
2 Ответов
115 Просмотров
Последний ответ Октябрь 11, 2018, 14:44:41
от Werwolfik