Что нового

Проверка устаовки программы или связи с расширением

V

VitAl2013

Гость
Хочу чтоб моя программа перед запускам проверяла установлен ли AdobeReader у пользователя. Вообще можно расширить до любого приложения. Либо проверить какая программа будет открывать pdf файл по умолчанию (опять же расширить до любого приложения). Как это сделать?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
VitAl2013
У меня AdobeReader не стоит, проверял на 7-Zip.
Код:
MsgBox(0, "", RegRead("HKEY_CLASSES_ROOT\.pdf", ""))

$i = 0
While 1
	$i += 1
	$var = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE", $i)
	If @error <> 0 then ExitLoop
	If StringInStr($var, "7-Zip") <> 0 Then
	MsgBox(0, "", "Установлен")
	ExitLoop
	EndIf
WEnd
If $var = "" Then
	MsgBox(0, "", "Не установлен")
EndIf
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Так корректнее.

Код:
#Include <WinAPIEx.au3>

If FileExists(_WinAPI_AssocQueryString('.pdf', $ASSOCSTR_EXECUTABLE)) Then
	MsgBox(0, '', 'Установлен')
Else
	MsgBox(0, '', 'Не установлен')
EndIf




Добавлено:
Сообщение автоматически объединено:

madmasles сказал(а):
Код:
MsgBox(0, "", RegRead("HKEY_CLASSES_ROOT\.pdf", ""))

$i = 0
While 1
	$i += 1
	$var = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE", $i)
	If @error <> 0 then ExitLoop
	If StringInStr($var, "7-Zip") <> 0 Then
	MsgBox(0, "", "Установлен")
	ExitLoop
	EndIf
WEnd
If $var = "" Then
	MsgBox(0, "", "Не установлен")
EndIf

madmasles, это не совсем правильно, если уж делать через RegRead(), то нужно примерно так:

Код:
$sKey = 'HKCR\' & RegRead('HKCR\.pdf', '')
$sShell =  RegRead($sKey & '\shell', '')
If Not $sShell Then
	$sShell = 'open'
EndIf
$sPath = StringRegExpReplace(RegRead($sKey & '\shell\' & $sShell & '\command', ''), '(?:"?)+((?:.*\\)?.*?\..*?)(?:"?)+ (.*)$', '\1')
If FileExists($sPath) Then
	MsgBox(0, '', 'Установлен')
Else
	MsgBox(0, '', 'Не установлен')
EndIf
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Yashied
Абсолютно с Вами согласен. Поползал по ветке HKEY_LOCAL_MACHINE\SOFTWARE и обнаружил, что не все установленные программы в этой ветке прописаны.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
madmasles сказал(а):
Поползал по ветке HKEY_LOCAL_MACHINE\SOFTWARE...

:blink:

А причем здесь HKEY_LOCAL_MACHINE? Ассоциации нужно искать в HKEY_CLASSES_ROOT.

1. HKCU\.pdf => Получаем имя ключа, например "AcroExch.Document".
2. HKCU\AcroExch.Document\shell => Получаем имя дефолтного раздела (то, что происходит при двойном клике на файл), по умолчанию - "open".
3. HKCU\AcroExch.Document\shell\ИМЯ РАЗДЕЛА\command => Получаем строку, содержащую путь к исполняемому файлу.
4. Извлекаем из полученной строки полный путь.
5. Проверяем наличие исполняемого файла на диске.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Yashied
Я имел в виду не ассоциации, а установлена программа или нет.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Аааа... Ну так это вообще абсурд искать программу по служебным записям. Мы же не можем знать куда именно программа сохраняет свои данные и сохраняет ли вообще. Тот же 7-Zip в следующей версии может хранить свои настройки уже не в "...\7-Zip", а например в "...\VasyaPupkin\Kalya-Malya\7-Zip" или вообще в другой ветке.

:smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Yashied [?]
Ну так это вообще абсурд искать программу по служебным записям.
А как тогда проверить установлена программа или нет, если она не связана с ассоциациями?

PS
Я в ветке HKEY_LOCAL_MACHINE\SOFTWARE установку Ad Muncher проверял на XP, Vista и 7, и везде, где установлен - показывал.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Еще могут быть полезными следующие ветки:
HKEY_CLASSES_ROOT\Applications
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
madmasles [?]
как тогда проверить установлена программа или нет, если она не связана с ассоциациями?
Насколько я понял, автору темы нужно проверить, не ассоциирована ли некая программа с расширением pdf, и скрипт Yashied'а как раз это и проверяет.

Мы не можем гадать как программа себя устанавливает, мы можем лишь проверить установлена ли она корректным путём.
 

AZJIO

Меценат
Меценат
Сообщения
2,762
Репутация
1,152
Есть программа, которая установлена для всех пользователей, а есть для текущего пользователя. Я знал, что ветка HKEY_LOCAL_MACHINE - для всех пользователей, а HKEY_CLASSES_ROOT для текущего, но решил проверить, является ли ветка HKEY_CLASSES_ROOT зеркалом HKEY_LOCAL_MACHINE\SOFTWARE\Classes, экспортировав привёл пути к общему имени, нашёл разницу. Выяснил, что HKEY_CLASSES_ROOT использует ветки HKEY_LOCAL_MACHINE\SOFTWARE\Classes и HKEY_CURRENT_USER\Software\Classes, но последняя является приоритетней HKLM, значит проверять нужно по HKEY_CLASSES_ROOT, как расширение так и связанное имя.
 
Верх