Что нового

_WinAPI_GetProcessStartDate - Корректировка под AutoIt 3.2.8.1

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Соорудил функцию (из WinAPIEx) для получения полной даты старта указанного процесса:

Код:
#AutoIt3Wrapper_Autoit3Dir=D:\AutoIt_Versions\AutoIt_3.2.8.1

Sleep(2000)

$sTime = _WinAPI_GetProcessStartDate(@AutoItPID)
ConsoleWrite(@error & @LF)
ConsoleWrite('AutoIt3.exe StartTime: ' & $sTime & @LF)

Func _WinAPI_GetProcessStartDate($iPID)
	If IsString($iPID) Then $iPID = ProcessExists($iPID)
	
	Local $Access = BitOR(0x0400, 0x0010)
	Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', $Access, 'int', 0, 'dword', $iPID)
	
	If (@error) Or (Not $hProcess[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Local $tFILETIME = DllStructCreate("dword Lo;dword Hi")
	Local $Ret = DllCall('kernel32.dll', 'int', 'GetProcessTimes', 'ptr', $hProcess[0], 'ptr', DllStructGetPtr($tFILETIME), 'uint64*', 0, 'uint64*', 0, 'uint64*', 0)
	
	If (@error) Or (Not $Ret[0]) Then
		$Ret = 0
	EndIf
	
	DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hProcess[0])
	
	If Not IsArray($Ret) Then
		Return SetError(2, 0, 0)
	EndIf
	
	Local $tFILETIMELOCAL = DllStructCreate("dword Lo;dword Hi")
	Local $Ret = DllCall('kernel32.dll', 'int', 'FileTimeToLocalFileTime', 'ptr', DllStructGetPtr($tFILETIME), 'ptr', DllStructGetPtr($tFILETIMELOCAL))
	
	If (@error) Or (Not $Ret[0]) Then
		Return SetError(3, 0, 0)
	EndIf
	
	Local $tSYSTEMTIME = DllStructCreate("word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds")
	Local $Ret = DllCall('kernel32.dll', 'int', 'FileTimeToSystemTime', 'ptr', DllStructGetPtr($tFILETIMELOCAL), 'ptr', DllStructGetPtr($tSYSTEMTIME))
	
	If (@error) Or (Not $Ret[0]) Then
		Return SetError(4, 0, 0)
	EndIf
	
	$tST = $tSYSTEMTIME
	
	Local $tData = DllStructCreate('wchar[1024]')
	Local $Ret = DllCall('kernel32.dll', 'int', 'GetTimeFormatW', 'long', 0x0400, 'dword', 0, _
		'ptr', DllStructGetPtr($tST), 'wstr', 'HH:mm:ss', 'ptr', DllStructGetPtr($tData), 'int', 1024)
	
    If (@error) Or (Not $Ret[0]) Then
		Return SetError(5, 0, '')
	EndIf
	
	Local $sTime = DllStructGetData($tData, 1)
	
	$tData = DllStructCreate('wchar[1024]')
	$Ret = DllCall('kernel32.dll', 'int', 'GetDateFormatW', 'long', 0x0400, 'dword', 0, _
		'ptr', DllStructGetPtr($tST), 'wstr', 'dd/MM/yyyy', 'ptr', DllStructGetPtr($tData), 'int', 1024)
	
    If (@error) Or (Not $Ret[0]) Then
		Return SetError(6, 0, '')
	EndIf
	
    Local $sDate = DllStructGetData($tData, 1)
	
	Return $sTime & ", " & $sDate
EndFunc


В 3.3.6.1 работает на ура, но вся идея в сооружений этой одной целой функций была в том, чтобы оно работало под 3.2.8.1 (да да, у меня есть ещё пару проектов на этой версий, обновляться пока нет времени, слишком много изменений).

Функция спотыкается сразу в начале, на OpenProcess GetProcessTimes.

У кого какие будут идеи?
Yashied, аууу :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Как спотыкается? Какую ошибку выдает DllCall()? Я думаю, что в 3.2.8.1 еще не было "uint64", используй "int64*" или "ptr" (у тебя все равно стоит 0).
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Yashied [?]
Какую ошибку выдает DllCall()?
2. Но я пытался поставить и none в качестве return type.

используй "int64*" или "ptr"
с int64* тоже самое (@error = 2), а при ptr скрипт вылетает с ошибкой «Память не может быть "written"» :smile: (кстати на 3.3.6.1 тоже вылетает).
 
Верх