Что нового

Как определить используется ли dll-файл?

Dimmak

Знающий
Сообщения
185
Репутация
9
Под спойлером находится функция проверки использования файла каким-либо приложением или системой, которая отлично справляется с поставленной задачей. Но появилась необходимость отследить используется ли dll-файл. Как средствами autoit это выяснить?
:scratch:
Код:
Func _FileInUse( $sFile )

    Local $hFile = _WinAPI_CreateFile($sFile, 2, 2, 0)

    If $hFile Then
        _WinAPI_CloseHandle($hFile)
        Return 0
    EndIf

    Local $Error = _WinAPI_GetLastError()

    Switch $Error
        Case 32 ; ERROR_SHARING_VIOLATION
            Return 1
        Case Else
            Return SetError($Error, 0, 0)
    EndSwitch

EndFunc   ;==>_FileInUse
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Попробовать его переместить/переименовать?
 
Автор
Dimmak

Dimmak

Знающий
Сообщения
185
Репутация
9
При попытке перезаписать система отвечает отказом( windows 7 ), хотя перемещается и удаляется файл без проблем. Что и делаю: удаляю, а затем снова файл копирую в нужную папку. Ерунда какая-то...
А тип файла не имеет значения: звуковой файл или dll принцип один и тот же.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Функция показывает какими процесcами используется (или по другому - в чье адресное пространство загружена) указанная dll.
Код:
#include <WinAPIEx.au3>
#include <APIConstants.au3>
#include <Array.au3>

$aResult = _DllInUse("scrrun.dll")
_ArrayDisplay($aResult)

$aResult = _DllInUse("shell32.dll")
_ArrayDisplay($aResult)

$aResult = _DllInUse("ntdll.dll")
_ArrayDisplay($aResult)

$aResult = _DllInUse("mlang.dll")
_ArrayDisplay($aResult)

$aResult = _DllInUse("mshtml.dll")
_ArrayDisplay($aResult)


Func _DllInUse($sDllName)
	Local $aDll[1], $sDll, $iCount = 0, $aProcessList, $aProcessModules
	$aProcessList = ProcessList()
	If IsArray($aProcessList) Then
		For $i = 1 To $aProcessList[0][0]
			$aProcessModules = _WinAPI_EnumProcessModules($aProcessList[$i][1], $LIST_MODULES_ALL)
			If Not IsArray($aProcessModules) Then ContinueLoop
			For $n = 1 To $aProcessModules[0][0]
				$sDll = _WinAPI_PathFindFileName($aProcessModules[$n][1])
				If $sDll = $sDllName Then
					$iCount += 1
					ReDim $aDll[$iCount + 1]
					$aDll[$iCount] = $aProcessList[$i][0]
				EndIf
			Next
		Next
	EndIf
	$aDll[0] = $iCount
	Return $aDll
EndFunc   ;==>_DllInUse
 
Верх