Что нового

Как получить адрес файла exe по имени исполняемого процесса?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Как получить путь к файлу по названию процесса?

Код:
Func Check()
	If ProcessExists("programm.exe") Then 
		как получить путь к файлу?
	Endif
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Suppir, очень легко было найти на форуме http://autoit-script.ru/index.php/topic,4362.0.html
смотри и переделывай под свои нужды
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
joiner, название темы было не вполне информативное, иначе бы точно нашел :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
_WinAPI_GetProcessFileName()

Эта функция возвращает путь к .exe файлу для 32- и 64-битных процессов, если вызывается из 64-битного приложения. В случае, когда функция вызывается из 32-битного приложения, она возвращает путь только для 32-бтных процессов.

В Vista+ можно использовать следующую функцию (не включена в WinAPIEx UDF), которая лишена вышеописанных ограничений:

Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

If _WinAPI_GetVersion() < '6.0' Then
	MsgBox(16, 'Error', 'Require Windows Vista or later.')
	Exit
EndIf

Global $ID = ProcessExists('explorer.exe')

If $ID Then
	ConsoleWrite(_WinAPI_GetProcessFileNameEx($ID) & @CR)
EndIf

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_GetProcessFileNameEx
; Description....: Retrieves the fully-qualified path to the executable file for the specified 32-bit or 64-bit process.
; Syntax.........: _WinAPI_GetProcessFileNameEx ( [$PID] )
; Parameters.....: $PID    - The PID of the process. Default (0) is the current process.
; Return values..: Success - The fully-qualified path to the executable file.
;                  Failure - Empty string and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: This function requires Windows Vista or later.
; Related........:
; Link...........: @@MsdnLink@@ QueryFullProcessImageName
; Example........: Yes
; ===============================================================================================================================

Func _WinAPI_GetProcessFileNameEx($PID = 0)

	If Not $PID Then
		$PID = @AutoItPID
	EndIf

	Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', __Iif($__WINVER < 0x0600, 0x00000400, 0x00001000), 'int', 0, 'dword', $PID)

	If (@error) Or (Not $hProcess[0]) Then
		Return SetError(1, 0, '')
	EndIf

	Local $Path = _WinAPI_QueryFullProcessImageName($hProcess[0])

	_WinAPI_CloseHandle($hProcess[0])
	If Not $Path Then
		Return SetError(1, 0, '')
	EndIf
	Return $Path
EndFunc   ;==>_WinAPI_GetProcessFileNameEx

; #FUNCTION# ====================================================================================================================
; Name...........: _WinAPI_QueryFullProcessImageName
; Description....: Retrieves the full name of the executable image for the specified process.
; Syntax.........: _WinAPI_QueryFullProcessImageName ( $hProcess )
; Parameters.....: $hProcess - A handle to the process. The handle must have the $PROCESS_QUERY_INFORMATION or
;                              $PROCESS_QUERY_LIMITED_INFORMATION access right.
; Return values..: Success   - The fully-qualified path to the module.
;                  Failure   - Empty string and sets the @error flag to non-zero.
; Author.........: Yashied
; Modified.......:
; Remarks........: This function requires Windows Vista or later.
; Related........:
; Link...........: @@MsdnLink@@ QueryFullProcessImageName
; Example........: Yes
; ===============================================================================================================================

Func _WinAPI_QueryFullProcessImageName($hProcess)

	Local $Ret = DllCall('kernel32.dll', 'int', 'QueryFullProcessImageNameW', 'ptr', $hProcess, 'dword', 0, 'wstr', '', 'dword*', 4096)

	If (@error) Or (Not $Ret[0]) Then
		Return SetError(1, 0, '')
	EndIf
	Return $Ret[3]
EndFunc   ;==>_WinAPI_QueryFullProcessImageName
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yashied
А если искомый процесс 32-битный (для которого нужно будет искать путь) и запускать скрипт будем в любой операционке (от XP до windows 8 ), то можно использовать _WinAPI_GetProcessFileName()?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Для 32-битных процессов функция _WinAPI_GetProcessFileName() всегда работает. Проблема только, если попытаться вызвать эту функцию из 32-битного скрипта для 64-битного процесса. Для универсальности можно написать так:

Код:
If $__WINVER >= 0x0600 Then
	$Path = _WinAPI_GetProcessFileNameEx($ID)
Else
	$Path = _WinAPI_GetProcessFileName($ID)
EndIf


Это будет работать везде, за исключением Windows XP x64, что является редкостью. Да и то, если только попытаться вызвать функцию из WOW64 для 64-битного процесса.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yashied

Кстати, до сих пор не могу понять, зачем люди компилируют 64-бит программы. На том c# же я всегда компилирую для 32-битных систем, также использую самый низший .NET Framework из возможных - 2.0. Ровно для того, чтобы программа запустилась у всех пользователей.

Имхо, компиляция в 64 бит оправдана только в случае, если программа использует > 1.5 Гб оперативной памяти.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ну, например Control Viewer должна существовать в двух вариантах, т.к. используется 64-битная адресация.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yashied

Еще вопрос, если можно. Обязательны ли для этой функции права администратора?
 

Yashied

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