Что нового

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

  • Автор темы VitAl2013
  • Дата начала
V

VitAl2013

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

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
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 711
Так корректнее.

Код:
#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 319
Yashied
Абсолютно с Вами согласен. Поползал по ветке HKEY_LOCAL_MACHINE\SOFTWARE и обнаружил, что не все установленные программы в этой ветке прописаны.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
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 319
Yashied
Я имел в виду не ассоциации, а установлена программа или нет.
 

Yashied

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

:smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
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 470
Репутация
2 401
madmasles [?]
как тогда проверить установлена программа или нет, если она не связана с ассоциациями?
Насколько я понял, автору темы нужно проверить, не ассоциирована ли некая программа с расширением pdf, и скрипт Yashied'а как раз это и проверяет.

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

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Есть программа, которая установлена для всех пользователей, а есть для текущего пользователя. Я знал, что ветка 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, как расширение так и связанное имя.
 
Верх