Что нового

Файлы использующиеся программой

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Возможно ли определить какие файлы задействовала посторонняя программа?
 
Автор
_Lexa98_

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
sngr
У меня есть программа типа такой, но мне нужно сделать это с помощью autoit ;)


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

Это вообще возможно?
 

Microteam

Осваивающий
Сообщения
74
Репутация
34
Возможно всё) Каждая программа которая открывает файл она просто создает хэндл для этого файла, а потом открывает через этот хэндл... А другие программы знают что этот файл использует другая программа, т.к на неё уже есть хэндл) Приведу пример, когда мы открываем файл в AutoIt делаем так:
Код:
$handle = FileOpen(@ScriptFullPath);
;// $handle вот это и есть хэндл...
;// а потом читаем по этому хэндлу
$data = FileRead($hande);


Вот я сам щас покопаюсь в API может найду такое дело... Как найду сразу выложу) ну если кто-нить первее меня не запостит)))
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Microteam сказал(а):
Код:
$handle = FileOpen(@ScriptFullPath);
;// $handle вот это и есть хэндл...
;// а потом читаем по этому хэндлу
$data = FileRead($hande);

запостит)))

$handle - это ID, а не хэндл. AutoIt не работает непосредственно с хэндлами, за исключением GUICreate(). Даже в справке написано (в кавычках):

Returns a file "handle" for use with subsequent file functions.

_Lexa98_

Если нужно получить список используемых DLL, то см. _WinAPI_EnumProcessModules() из WinAPEx. Список открытых файлов можно получить так:

Код:
#Include <APIConstants.au3>
#Include <Array.au3>
#Include <WinAPIEx.au3>

Global Const $PID = ProcessExists('explorer.exe')

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

Dim $List[101] = [0]

$Data = _WinAPI_EnumProcessHandles($PID)
If IsArray($Data) Then
	$hTarget = _WinAPI_GetCurrentProcess()
	$hSource = _WinAPI_OpenProcess($PROCESS_DUP_HANDLE, 0, $PID)
	If $hSource Then
		For $i = 1 To $Data[0][0]
			Switch $Data[$i][1]
				Case 28
					Switch $Data[$i][2]
						Case 0x00100000, 0x00120189, 0x0012019F
							ContinueLoop
						Case Else
							$hObject = _WinAPI_DuplicateHandle($hSource, $Data[$i][0], $hTarget)
							If Not @error Then
								$File = _WinAPI_GetFinalPathNameByHandleEx($hObject)
								If Not @error Then
									$List[0] += 1
									If $List[0] > UBound($List) - 1 Then
										ReDim $List[$List[0] + 100]
									EndIf
									$List[$List[0]] = StringTrimLeft($File, 4)
								EndIf
								_WinAPI_CloseHandle($hObject)
							EndIf
					EndSwitch
				Case Else

			EndSwitch
		Next
		ReDim $List[$List[0] + 1]
	EndIf
EndIf

If $List[0] Then
	_ArrayDisplay($List)
EndIf
 
Автор
_Lexa98_

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Yashied
При запуске выдает ошибку:
Код:
==> Incorrect number of parameters in function call.:
$hObject = _WinAPI_DuplicateHandle($hSource, $Data[$i][0], $hTarget)
$hObject = ^ ERROR
>Exit code: 1    Time: 1.842
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У тебя AutoIt 3.3.8.0 или выше. Замени вызов этой функции в соответствии с описанием в WinAPI.au3 (см. справку).



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

Код:
_WinAPI_DuplicateHandle($hSource, $Data[$i][0], $hTarget, 0, 0, 2)
 
Автор
_Lexa98_

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Yashied
Когда запускаю ничего не происходит :(
 

Yashied

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