Hey Leute,
die Funktion, die ich definiert habe verwendet die DISM API und ruft folgende Funktion darin auf:
ZitatAlles anzeigenHRESULT WINAPI DismGetDriverInfo (
_In_ DismSession Session,
_In_ PCWSTR DriverPath,
_Outptr_result_buffer_(*Count) DismDriver** Driver,
_Out_ UINT* Count,
_Out_opt_ DismDriverPackage** DriverPackage
);
Das zurückgegeben struct sieht so aus:
ZitatAlles anzeigentypedef struct DismDriverPackage
{
PCWSTR PublishedName;
PCWSTR OriginalFileName;
BOOL InBox;
PCWSTR CatalogFile;
PCWSTR ClassName;
PCWSTR ClassGuid;
PCWSTR ClassDescription;
BOOL BootCritical;
DismDriverSignature DriverSignature;
PCWSTR ProviderName;
SYSTEMTIME Date;
UINT MajorVersion;
UINT MinorVersion;
UINT Build;
UINT Revision
}
DismDriver;
Das Element "SYSTEMTIME" beschreibt ein struct und an dieser Stelle entsteht auch mein Problem. Das struct Systemtime ist schon standardmäßig definiert und wird z.B. für
[autoit]_Date_Time_GetSystemTime
[/autoit]
verwendet. Habe dazu einfach Date.au3 included. So sieht's aus:
; #STRUCTURE# ===================================================================================================================
; Name...........: $tagSYSTEMTIME
; Description ...: Specifies a date and time, in coordinated universal time (UTC)
; Fields ........: Year - Year
; Month - Month
; Dow - Day of week
; Day - Day
; Hour - Hour
; Minute - Minute
; Second - Second
; MSeconds - MSeconds
; Author ........: Paul Campbell (PaulIA)
; Remarks .......:
; ===============================================================================================================================
Global Const $tagSYSTEMTIME = "struct;word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds;endstruct"
Mein code:
[autoit]Func _DISM_GetDrivers($Session, $AllDrivers = False)
Local $tmp_tagDismDriverPackage, $DriverPackage, $Count
Local $rParams = 15 ; count of return parameter
Local $aResult = DllCall($ghdismapi, "LONG", "DismGetDrivers", _
"PTR", $Session, _
"BOOL", $AllDrivers, _
"PTR*", $DriverPackage, _
"UINT*", $Count _
)
If @error Or $aResult[0] <> $S_OK Then Return SetError(@error, @extended, Hex($aResult[0]))
;~ If @error Then Return SetError(@error, @extended, 0)
;~ Return SetExtended(_WinAPI_GetLastError(), Hex($aResult[0]))
;~ _ArrayDisplay($aResult)
[/autoit][autoit][/autoit][autoit]$DriverPackage = $aResult[3]
$Count = 1;$aResult[4]
Local $aReturn[$Count][$rParams]
For $i = 1 To $Count
$tmp_tagDismDriverPackage &= $tagDismDriverPackage
If $i = $Count Then ExitLoop
$tmp_tagDismDriverPackage &= ";"
Next
Local $stString = DllStructCreate($tmp_tagDismDriverPackage, $DriverPackage)
ConsoleWrite("error: " & @error & @CRLF)
_DLLStructDisplay($stString, $tmp_tagDismDriverPackage)
$k = 0
For $i = 1 To $Count
For $j = 1 To $rParams
$k += 1
If BitOR($j = 1, $j = 2, $j = 4, $j = 5, $j = 6, $j = 7, $j = 10) Then
$tmp_stString = DllStructCreate("WCHAR [260]", DllStructGetData($stString, $k))
$aReturn[$i-1][$j-1] &= DllStructGetData($tmp_stString, 1)
ContinueLoop
ElseIf $j = 11 Then
MsgBox(0, "asdad", $k)
$tmp_stString = DllStructCreate($tagSYSTEMTIME, DllStructGetData($stString, $k))
;~ ConsoleWrite("date: " & _Date_Time_SystemTimeToDateTimeStr($tmp_stString) & @CRLF)
_DLLStructDisplay($tmp_stString, $tagSYSTEMTIME)
$aReturn[$i-1][$j-1] &= _Date_Time_SystemTimeToDateTimeStr($tmp_stString)
ContinueLoop
EndIf
$aReturn[$i-1][$j-1] &= DllStructGetData($stString, $k)
Next
Next
; free resources
_DISM_Delete($stString)
_DISM_Delete($tmp_stString)
_Arraydisplay($aReturn)
Return SetExtended(_WinAPI_GetLastError(), $aReturn)
EndFunc ;==>_DISM_GetDrivers
Soweit stimmt alles, aber ich bekomme es nicht hin, die "SYSTEMTIME" vernünftig auszugeben. Die beiden Structs sehen so aus:
Struct 1:
[Blockierte Grafik: http://imageshack.us/a/img248/6586/struct1.png]
Struct 2:
[Blockierte Grafik: http://imageshack.us/a/img4/8963/struct2.png]
Der Return so:
[Blockierte Grafik: http://imageshack.us/a/img706/9121/return1.png]
Im zweiten strcut sollte jetzt eigentlich 21.06.2006 stehen, denn wenn ich das Kommandozeilen Programm von Dism benutze und mir die Driver Info von oem0.inf ausgeben lasse zeigt er es so an:
[Blockierte Grafik: http://imageshack.us/a/img267/4740/dismexeoutput.png]
Hat jemand eine Idee, warum das Datum nicht korrekt zurückgegeben bzw. ausgegeben wird???
Vielen Danke schonmal jungs!