Что нового

[Реестр] Получение пути к программе из реестра

glax24

Знающий
Сообщения
72
Репутация
14
Проблема в следующем, надо проверь есть ли на диске программа ассоциированная например с txt.
Путь может содержать как переменные среды cmd.exe, так и полный путь к программе.
Нет ли более универсального способа, а то мой вариант мне не особо нравится.
Код:
Func CheckProg()
	Local $sPathProg = RegRead("HKEY_CLASSES_ROOT\txtfile\shell\open\command", "")
	$sPathProg = StringRegExpReplace($sPathProg, ' %.', '')
	Local $sPath = StringRegExpReplace($sPathProg, '\\.*', '')
	If $sPath = '%SystemRoot%' Then $sPath = @WindowsDir
	ConsoleWrite($sPathProg & @CRLF)
	$sPathProg = StringReplace($sPathProg, '%SystemRoot%', $sPath)
	ConsoleWrite($sPathProg & @CRLF)
	If FileExists($sPathProg) = 1 Then
		ConsoleWrite("OK" & @CRLF)
	Else
		ConsoleWrite("ERROR" & @CRLF)
	EndIf
EndFunc   ;==>CheckProg
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
glax24
Обычно функция выдаёт результат, а вывод снаружи, а то не все же используют SciTE и ваша функция просто ничего не выдаёт.

Есть два варианта

Мой
Код:
;получить путь ассоциированной программы. Например:
; 1. нужно ini-файл или cfg и т.д. открыть в текстовом редакторе, который ассоциирован с txt
; 2. нужно открыть каталог программы ассоциированный с указанным типом.
; Идеалный вариант - модификация trancexx - http://www.autoitscript.com/forum/topic/96988-winapi-findexecutable-replacement/page__view__findpost__p__697477

$Editor=_TypeGetPath('txt')
; $Editor=_TypeGetPath('bmp')
If @error Then $Editor=@SystemDir&'\notepad.exe'

MsgBox(0, 'Сообщение', $Editor)

Func _TypeGetPath($type)
	Local $aPath=''
	Local $typefile = RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type, 'Progid')
	If @error Or  $typefile='' Then
		$typefile = RegRead('HKCR\.'&$type, '')
		If @error Then
			$aPath = RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type&'\OpenWithList', 'a')
			If @error Or $aPath='' Then Return SetError(1)
		EndIf
	EndIf
	If $aPath='' Then
		Local $Open = RegRead('HKCR\' & $typefile & '\shell', '')
		If @error Or $Open='' Then $Open='open'
		$typefile = RegRead('HKCR\' & $typefile & '\shell\'&$Open&'\command', '')
		If @error Then
			$aPath = RegRead('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.'&$type&'\OpenWithList', 'a')
			If @error Or $aPath='' Then
				Return SetError(1)
			Else
				$typefile=$aPath
			EndIf
		EndIf
	Else
		$typefile=$aPath
	EndIf
	Local $aPath=StringRegExp($typefile, '(?i)(^.*)(\.exe.*)$', 3)
	If @error Then Return SetError(1)
	$aPath = StringReplace($aPath[0], '"', '') & '.exe'
	Opt('ExpandEnvStrings', 1)
	If FileExists($aPath) Then
		$aPath=$aPath
		Opt('ExpandEnvStrings', 0)
		Return $aPath
	EndIf
	Opt('ExpandEnvStrings', 0)
	If FileExists(@SystemDir&'\'&$aPath) Then
		Return @SystemDir&'\'&$aPath
	ElseIf FileExists(@WindowsDir&'\'&$aPath) Then
		Return @WindowsDir&'\'&$aPath
	EndIf
	Return SetError(1)
EndFunc

и trancexx
Код:
; http://www.autoitscript.com/forum/topic/96988-winapi-findexecutable-replacement/page__view__findpost__p__697477
; поправил для своих задач. Если не возвращает путь, то возвращает ошибку.

$Editor=_FileAssociation('.txt')
If @error Then $Editor=@SystemDir&'\notepad.exe'

MsgBox(0, 'Сообщение', $Editor)

Func _FileAssociation($sExt)

    Local $aCall = DllCall("shlwapi.dll", "int", "AssocQueryStringW", _
            "dword", 0x00000040, _ ;$ASSOCF_VERIFY
            "dword", 2, _ ;$ASSOCSTR_EXECUTABLE
            "wstr", $sExt, _
            "ptr", 0, _
            "wstr", "", _
            "dword*", 65536)

    If @error Then Return SetError(1, 0, "")

    If Not $aCall[0] Then
        Return SetError(0, 0, $aCall[5])
    ElseIf $aCall[0] = 0x80070002 Then
        Return SetError(1, 0, "{unknown}")
    ElseIf $aCall[0] = 0x80004005 Then
        Return SetError(1, 0, "{fail}")
    Else
        Return SetError(2, $aCall[0], "")
    EndIf

EndFunc  ;==>_FileAssociation
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
glax24,
Посмотрите функцию _WinAPI_AssocQueryString() из библиотеки WinAPIEx.au3.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
madmasles [?]
Посмотрите функцию _WinAPI_AssocQueryString()

Код:
#include <apiconstants.au3>
#Include <WinAPIex.au3>
ConsoleWrite(_WinAPI_AssocQueryString('.txt',$ASSOCSTR_EXECUTABLE) & @CRLF)
 
Верх