Leider immer noch nicht...ContinueLoop
Beiträge von Trolleule1337
-
-
-
Sehr kreativ, aber wie würdest du das hier in eine Zeile zaubern?
[autoit]If $curElement = "" Then $e += 1 & ContinueLoop
[/autoit] -
Okay anderer Versuch:
[autoit]If StringInStr($aStDataTypes[$e], "PTR") <> 0 Then
[/autoit][autoit][/autoit][autoit]
$curElement = DllStructGetData(DllStructCreate("WCHAR [260]", DllStructGetData($getPackageInfo, $e)), 1)
If $curElement = "" Then $e += 1 & ContinueLoop ; ?????????????EndIf
[/autoit]
Switch $index
...
...
...
$e += 1Wenn $curElement = "" muss ich $index so setzen, dass er die Switch Schleife überspringt. Ich brauche entweder ein $e +=1 und ein ContinueLoop in einer Zeile oder $index so setzen, dass er nicht ins Switch reingeht. Hat jemand ne Idee?
-
so wie du es beschrieben hast, ist es ja Standard. Interessant wäre es in einer Zeile unterzubringen.
Wieso funktioniert denn:
[autoit]If $curElement = "" Then BitOr(MsgBox(0, "bla", "hier"), MsgBox(0, "bla", "hier"))
[/autoit]Danke!
-
Hi,
ist es möglich mehrere Then Statements in einer Zeile zu definieren:geht nicht, aber so in der Art
[autoit]If $curElement = "" Then $e += 1 Then ContinueLoop
[/autoit]sieht halt besser aus!
-
Also die Funktion funktioniert nun. Aber meine Lösung zum Auslesen der Daten und strukturieren des Arrays wirkt auf mich weniger elegant gelöst und unsauber programmiert. Das hier ist meine beste Lösung, die ich gefunden habe, was meint ihr?:
[autoit]Func _DISM_GetDrivers($Session, $AllDrivers = False)
[/autoit][autoit][/autoit][autoit]
Local $aStDataTypes = StringSplit($tagDismDriverPackage, ';')
Local $getSystemTime = DllStructCreate($_tagSYSTEMTIME)
Local $tmp_tagDismDriverPackage, $tmp_stString, $DriverPackage, $Count
Local $aParams = 12 ; count of return parameter in array
Local $DriverPackageInfo = 10 ; part one of struct
Local $Date = 8 ; part two of struct
Local $DriverVersion = 4 ; part three of struct
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]))$DriverPackage = $aResult[3]
[/autoit][autoit][/autoit][autoit]
$Count = $aResult[4]Local $aReturn[$Count][$aParams]
[/autoit][autoit][/autoit][autoit]
For $i = 1 To $Count
$tmp_tagDismDriverPackage &= $tagDismDriverPackage
If $i = $Count Then ExitLoop
$tmp_tagDismDriverPackage &= ";"
NextLocal $stString = DllStructCreate($tmp_tagDismDriverPackage, $DriverPackage)
[/autoit][autoit][/autoit][autoit]$k = 0
[/autoit][autoit][/autoit][autoit]
For $i = 1 To $Count
Local $index = 0
Local $Version = ""
For $j = 1 To $DriverPackageInfo
$k += 1
$index += 1
If StringInStr($aStDataTypes[$j], "PTR") <> 0 Then
ConsoleWrite("ptr: " & $j & @CRLF)
$tmp_stString = DllStructCreate("WCHAR [260]", DllStructGetData($stString, $k))
$aReturn[$i-1][$index-1] &= DllStructGetData($tmp_stString, 1)
ContinueLoop
EndIf
$aReturn[$i-1][$index-1] &= DllStructGetData($stString, $k)
Next
For $j = 1 To $Date
$k += 1
DllStructSetData($getSystemTime, $j, DllStructGetData($stString, $k))
Next
$index += 1
$aReturn[$i-1][$index-1] &= _Date_Time_SystemTimeToDateStr($getSystemTime)
For $j = 1 To $DriverVersion
$k += 1
$Version &= DllStructGetData($stString, $k)
If $j = $DriverVersion Then ExitLoop
$Version &= "."
Next
$index += 1
$aReturn[$i-1][$index-1] &= $Version
Next; free resources
[/autoit]
_DISM_Delete($stString)
_DISM_Delete($tmp_stString)
_Arraydisplay($aReturn)
Return SetExtended(_WinAPI_GetLastError(), $aReturn)
EndFunc ;==>_DISM_GetDriversDas gesamte struct sieht so aus:
[Blockierte Grafik: http://imageshack.us/a/img849/8476/structall.png]Das struct hat 22 Parameter und es kommen jeweils weitere 22 Parameter dazu, abhängig von der Anzahl der Treiber die in $Count gespeichert werden. Deshalb brauchte ich auch eine fortlaufende Zahl ($k).
Mein Array sieht nun so aus:
[Blockierte Grafik: http://imageshack.us/a/img46/9683/arraylast.png]Vielen Dank für eure Hilfe Leute!
-
-
Grüß dich,
sehr gut beobachtet Andy! Ja du hast recht die sind auch net richtig, aber ich finde das Thema schon recht schwierig und wollte es nicht noch komplizierter machen, daher habe ich das erstmal außen vorgelassen. Wo wir gerade dabei sind. Ich habe mir die Treiberdatei angesehen und dort gibt es keine Information zu "MajorVersion", "MinorVersion", "Build" und "Revision". Das ist schon ziemlich komisch. Weiß nicht mal woher er die Daten für Revision und "MajorVersion" hernimmt. Naja es sei denn, "6.1.7600.16385" soll die MajorVersion sein.Ich kann nicht sagen ob es die selbe SYSTEMTIME wie aus _Date_Time_GetSystemTime() ist, ich habe zwar die dismapi.h Datei, dort ist es aber nicht definiert worden, daher nehme ich an es wird die "Global" definierte SYSTEMTIME verwendet. Kann ich das irgendwie nachprüfen???
EDIT:
Was auch komisch ist: Ich habe $Count auf 1 gesetzt, damit er erstmal nur 1 Treiber einliest. Habe jetzt mal die ausgelesene Anzahl genommen (2 Treiber) und das Struct sieht sehr merkwürdig aus:Struct für 2 Treiber:
[Blockierte Grafik: http://img843.imageshack.us/img843/2226/bild5mg.png]InBox dürfte z.B. nur 0 oder 1 sein!!!
AutoIT stürzt auch bei jedem 2ten mal ab.Achja ganz vergessen:
[autoit]
Meine Definition vom DismDriverPackage struct:; DismDriverPackage
[/autoit]
Global Const $tagDismDriverPackage = "PTR PublishedName;PTR OriginalFileName;BOOL InBox;PTR CatalogFile;PTR ClassName;PTR ClassGuid;PTR ClassDescription;" & _
"BOOL BootCritical;INT DriverSignature;PTR ProviderName;PTR Date;UINT MajorVersion;UINT MinorVersion;UINT Build;UINT Revision" -
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]
[autoit]
verwendet. Habe dazu einfach Date.au3 included. So sieht's aus:; #STRUCTURE# ===================================================================================================================
[/autoit]
; 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)
[/autoit][autoit][/autoit][autoit]
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]
[/autoit][autoit][/autoit][autoit]
$Count = 1;$aResult[4]Local $aReturn[$Count][$rParams]
[/autoit][autoit][/autoit][autoit]
For $i = 1 To $Count
$tmp_tagDismDriverPackage &= $tagDismDriverPackage
If $i = $Count Then ExitLoop
$tmp_tagDismDriverPackage &= ";"
NextLocal $stString = DllStructCreate($tmp_tagDismDriverPackage, $DriverPackage)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("error: " & @error & @CRLF)
_DLLStructDisplay($stString, $tmp_tagDismDriverPackage)$k = 0
[/autoit][autoit][/autoit][autoit]
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
[/autoit]
_DISM_Delete($stString)
_DISM_Delete($tmp_stString)
_Arraydisplay($aReturn)
Return SetExtended(_WinAPI_GetLastError(), $aReturn)
EndFunc ;==>_DISM_GetDriversSoweit 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!
-
Alter du bist sooooo krank man. Das funktioniert du wilder!
Er gibt zwar nen error in Zeile 4 deines codes aus, weiß allerdings nicht warum:
Zitat==> Error in expression.:
Global Const $tagDismMountedImageInfo = "PTR MountPath;" "PTR ImageFilePath;" "UINT ImageIndex;" "INT DismMountMode;" "INT MountStatus"
Global Const $tagDismMountedImageInfo = ^ ERRORHabs jetzt gezwungenermaßen in eine zeile gepackt:
[autoit]Global Const $tagDismMountedImageInfo = "PTR MountPath;PTR ImageFilePath;UINT ImageIndex;INT DismMountMode;INT MountStatus"
[/autoit]Kannst du mir bitte noch die Ausgabe für "UINT ImageIndex;INT DismMountMode;INT MountStatus" schreiben, denn das was du da gebastelt hast ist noch zu fern für meine Kenntnisse



Danke jung!
Edit:
[autoit]
Die anderen Werte bekomme ich dann so:ConsoleWrite(DllStructGetData ($mii, 3) & @CRLF)
[/autoit]
ConsoleWrite(DllStructGetData ($mii, 4) & @CRLF)
ConsoleWrite(DllStructGetData ($mii, 5) & @CRLF) -
Egal was ich probiere ich bekomme immer den selben output:
ZitatAlles anzeigen0x0066CDC0
0x03D909A0
0
0
0
leer
leer$Return[0] = DllStructGetData($wchar, 1) ist leer
$Return[1] = DllStructGetData($wchar2, 1) ist auch leerKönnte es vllt. an folgender Remark liegen:
ZitatThe array of DismMountedImageInfo structures are allocated by the DISM API on the heap.
DismMountedImageInfo Structure
ZitatAlles anzeigentypedef struct _DismMountedImageInfo
{
PCWSTR MountPath;
PCWSTR ImageFilePath;
UINT ImageIndex;
DismMountMode MountMode;
DismMountStatus MountStatus;
}
DismMountedImageInfo;Hier nochmal nachzulesen: DismGetMountedImageInfo Function
Hier nochmal der code:
[autoit]; Function Call
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
;~ HRESULT WINAPI DismGetMountedImageInfo(
;~ _Outptr_result_buffer_(*Count) DismMountedImageInfo** MountedImageInfo,
;~ _Out_ UINT* Count
;~ );Func DismGetMountedImageInfo()
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & "DismGetMountedImageInfo" & @CRLF)
Global Const $DismReadWrite = 0
Global Const $DismReadOnly = 1
Global Const $DismMountStatusOk = 0
Global Const $DismMountStatusNeedsRemount = 1
Global Const $DismMountStatusInvalid = 2Local $Count
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Local $Return[7]
Local $wchar = DllStructCreate("WCHAR[260]")
Local $ptrwchar = DllStructGetPtr($wchar)
Local $wchar2 = DllStructCreate("WCHAR[260]")
Local $ptrwchar2 = DllStructGetPtr($wchar2);~ Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"
[/autoit][autoit][/autoit][autoit]
;~ ConsoleWrite($tagDismMountedImageInfo & @CRLF);~ MsgBox(0, "sadfaf", $tagDismMountedImageInfo)
[/autoit][autoit][/autoit][autoit]Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"
[/autoit][autoit][/autoit][autoit]
Local $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2)
Local $pDismMountedImageInfo = DllStructGetPtr($tDismMountedImageInfo)Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
[/autoit][autoit][/autoit][autoit]
"ptr", $pDismMountedImageInfo, _
"uint*", $Count _
)
ConsoleWrite("DismGetMountedImageInfo error: " & @error & @CRLF)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
;~ _ArrayDisplay($aResult, "DismGetMountedImageInfo aResult")
ConsoleWrite("DismGetMountedImageInfo returns: " & $aResult[0] & @CRLF)
ConsoleWrite("Mounted Image Count: " & $aResult[2] & @CRLF)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$Return[0] = DllStructGetData($tDismMountedImageInfo, 1)
$Return[1] = DllStructGetData($tDismMountedImageInfo, 2)
$Return[2] = DllStructGetData($tDismMountedImageInfo, 3)
$Return[3] = DllStructGetData($tDismMountedImageInfo, 4)
$Return[4] = DllStructGetData($tDismMountedImageInfo, 5)
$Return[5] = DllStructGetData($wchar, 1)
$Return[6] = DllStructGetData($wchar2, 1)
_ArrayDisplay($Return, "DismGetMountedImageInfo aReturn")ConsoleWrite("---" & @CRLF)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite($Return[0] & @CRLF) ; MountPath
ConsoleWrite($Return[1] & @CRLF) ; ImageFilePath
ConsoleWrite($Return[2] & @CRLF) ; ImageIndex
ConsoleWrite($Return[3] & @CRLF) ; DismMountMode
ConsoleWrite($Return[4] & @CRLF) ; MountStatus
ConsoleWrite($Return[5] & @CRLF)
ConsoleWrite($Return[6] & @CRLF)EndFunc
[/autoit]Hast du ne idee champ?

-
Klappt leider nicht. Output ist leer. Hast du eine Idee?
-
Hey danke, schau mal bitte:
[autoit]Func DismGetMountedImageInfo()
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & "DismGetMountedImageInfo" & @CRLF)
Global Const $DismReadWrite = 0
Global Const $DismReadOnly = 1
Global Const $DismMountStatusOk = 0
Global Const $DismMountStatusNeedsRemount = 1
Global Const $DismMountStatusInvalid = 2
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
;~ $wchar = DllStructCreate("WCHAR[260]")
;~ $ptrwchar = DllStructGetPtr($wchar)
;~
;~ $wchar2 = DllStructCreate("WCHAR[260]")
;~ $ptrwchar2 = DllStructGetPtr($wchar2)
;~
;~ Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"
;~ ConsoleWrite($tagDismMountedImageInfo & @CRLF)
;~
Local $Return[10];~ Local $tWIM_MOUNT_LIST = DllStructCreate($tagDismMountedImageInfo) ; & ";" & $tagDismMountedImageInfo)
[/autoit][autoit][/autoit][autoit]
;~ Local $pWIM_MOUNT_LIST = DllStructGetPtr($tWIM_MOUNT_LIST)
;~
Local $test$wchar = DllStructCreate("WCHAR[260]")
[/autoit][autoit][/autoit][autoit]
$ptrwchar = DllStructGetPtr($wchar)
$wchar2 = DllStructCreate("WCHAR[260]")
$ptrwchar2 = DllStructGetPtr($wchar2)
Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"
Global $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2)
$pDismMountedImageInfo = DllStructGetPtr($tDismMountedImageInfo)Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
[/autoit][autoit][/autoit][autoit]
"ptr", $pDismMountedImageInfo, _
"uint*", $test _
)
ConsoleWrite("DismGetMountedImageInfo error: " & @error & @CRLF)
[/autoit][autoit][/autoit][autoit]
;~ _ArrayDisplay($aResult, "DismGetMountedImageInfo aResult")
ConsoleWrite("DismGetMountedImageInfo returns: " & $aResult[0] & @CRLF)
ConsoleWrite("Mounted Image Count: " & $aResult[2] & @CRLF)$Return[0] = DllStructGetData($tDismMountedImageInfo, 1)
[/autoit]
$Return[1] = DllStructGetData($tDismMountedImageInfo, 2)
$Return[2] = DllStructGetData($tDismMountedImageInfo, 3)
$Return[3] = DllStructGetData($tDismMountedImageInfo, 4)
$Return[4] = DllStructGetData($tDismMountedImageInfo, 5)
;~ _ArrayDisplay($Return, "DismGetMountedImageInfo aReturn")
ConsoleWrite("---" & @CRLF)
ConsoleWrite($Return[0] & @CRLF) ; MountPath
ConsoleWrite($Return[1] & @CRLF) ; ImageFilePath
ConsoleWrite($Return[2] & @CRLF) ; ImageIndex
ConsoleWrite($Return[3] & @CRLF) ; DismMountMode
ConsoleWrite($Return[4] & @CRLF) ; MountStatus
EndFuncOutput:
ZitatAlles anzeigen--------------------------------DismGetMountedImageInfo
DismGetMountedImageInfo error: 0
DismGetMountedImageInfo returns: 0
Mounted Image Count: 1
---
0x00E9DD28
0x03D80970
0
0
0Wo habe ich was vergessen?
-
Bekomm ich bestimmt hin, aber bevor du wieder weg bist, würde ich dich doch sehr bitten, das mal aufzuzeigen, falls ich es doch net hinbekomme

So?
[autoit]$wchar = DllStructCreate("WCHAR[260]")
[/autoit]
$ptrwchar = DllStructGetPtr($wchar)
$wchar2 = DllStructCreate("WCHAR[260]")
$ptrwchar2 = DllStructGetPtr($wchar2)
Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"Geht zwar nicht, aber so stell ich mir das vor...Den ImageIndex gibt er mir auch falsch zurück (bekomme 0), das muss bei UINT ImageIndex auch was falsch sein. Die letzten beiden sind richtig.
Edit: Das vorletzte stimmt auch nicht, da müsste er mir eine 1 zurückgeben, da ich das image mit Nur Leserechten gemountet habe und er deshalb den status "$ReadOnly" => 1 zurückgeben müsste.
Danke! -
Laut Log funktioniert nun alles:
Aber der Return von GetMountedImageInfo ist immer noch falsch. Das kann nur bedeuten, dass der Fehler hier zu suchen ist:
[autoit]Global Const $tagDismMountedImageInfo = "WCHAR MountPath[260];WCHAR ImageFilePath[260];UINT ImageIndex;Int DismMountMode;Int MountStatus"
[/autoit]Structure Aufbau:
ZitatAlles anzeigentypedef struct _DismMountedImageInfo
{
PCWSTR MountPath;
PCWSTR ImageFilePath;
UINT ImageIndex;
DismMountMode MountMode;
DismMountStatus MountStatus;
}
DismMountedImageInfo; -
Also bin jetzt soweit, dass DismInitialize und DismOpenSession 0 zurückgeben. Habe nochmal die Funktion GetMountedImageInfo aus der Wim API aufgegriffen, da diese in der Dism API auch vorhanden ist. Auch bei dieser Funktion bekomme ich 0 zurück aber mit dem return des structs stimmt irgendetwas nicht:
Hier mal das Ganze File:
[autoit]#include-once
[/autoit][autoit][/autoit][autoit]#include <WinAPI.au3>
[/autoit][autoit][/autoit][autoit]
#include <Array.au3>Global Const $DISMAPI_E_INVALID_IMAGE_NAME = 0xC0040006 ; DismInitialize has already been called by the process without a matching call to DismShutdown.
[/autoit][autoit][/autoit][autoit]Global $gsDismDLL = "C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Deployment Tools\x86\DISM\dismapi.dll"
[/autoit][autoit][/autoit][autoit]
Global $ghdismapi = 0
Global $giDISMRef = 0;~ DllClose($dll)
[/autoit][autoit][/autoit][autoit]$aoutput = _DISM_Startup()
[/autoit][autoit][/autoit][autoit];~ MsgBox(0, "gfhdfgh", $aoutput & " " & _WinAPI_GetLastError())
[/autoit][autoit][/autoit][autoit]DismInitialize()
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
;~ $session = DismOpenSession("C:\mount")
DismGetMountedImageInfo();~ HRESULT WINAPI DismGetMountedImageInfo(
[/autoit][autoit][/autoit][autoit]
;~ _Outptr_result_buffer_(*Count) DismMountedImageInfo** MountedImageInfo,
;~ _Out_ UINT* Count
;~ );Func DismGetMountedImageInfo()
[/autoit][autoit][/autoit][autoit]
Global Const $DismReadWrite = 0
Global Const $DismReadOnly = 1
Global Const $DismMountStatusOk = 0
Global Const $DismMountStatusNeedsRemount = 1
Global Const $DismMountStatusInvalid = 2Global Const $tagDismMountedImageInfo = "WCHAR MountPath[260];WCHAR ImageFilePath[260];UINT ImageIndex;Int DismMountMode;Int MountStatus"
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Local $Return[10]Local $tWIM_MOUNT_LIST = DllStructCreate($tagDismMountedImageInfo) ; & ";" & $tagDismMountedImageInfo)
[/autoit][autoit][/autoit][autoit]
Local $pWIM_MOUNT_LIST = DllStructGetPtr($tWIM_MOUNT_LIST)
Local $tImageInfoCount = DllStructCreate("UINT")
Local $pImageInfoCount = DllStructGetPtr($tImageInfoCount)
Local $testLocal $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
[/autoit][autoit][/autoit][autoit]
"ptr", $pWIM_MOUNT_LIST, _
"uint*", $test _
)
ConsoleWrite("DismGetMountedImageInfo error: " & @error & @CRLF)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
_ArrayDisplay($aResult, "DismGetMountedImageInfo aResult")
ConsoleWrite("DismGetMountedImageInfo returns: " & $aResult[0] & @CRLF)
ConsoleWrite("Mounted Image Count: " & $aResult[2] & @CRLF)
;~ ConsoleWrite($lol & @CRLF)$Return[0] = DllStructGetData($tWIM_MOUNT_LIST, 1)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$Return[1] = DllStructGetData($tWIM_MOUNT_LIST, 2)
$Return[2] = DllStructGetData($tWIM_MOUNT_LIST, 3)
$Return[3] = DllStructGetData($tWIM_MOUNT_LIST, 4)
$Return[4] = DllStructGetData($tWIM_MOUNT_LIST, 5)
;~ _ArrayDisplay($Return, "DismGetMountedImageInfo aReturn")
ConsoleWrite("---" & @CRLF)
ConsoleWrite($Return[0] & @CRLF) ; MountPath
ConsoleWrite($Return[1] & @CRLF) ; ImageFilePath
ConsoleWrite($Return[2] & @CRLF) ; ImageIndex
ConsoleWrite($Return[3] & @CRLF) ; DismMountMode
ConsoleWrite($Return[4] & @CRLF) ; MountStatus
EndFunc;~ HRESULT WINAPI DismOpenSession(
[/autoit][autoit][/autoit][autoit]
;~ _In_ PCWSTR ImagePath,
;~ _In_opt_ PCWSTR WindowsDirectory,
;~ _In_opt_ WCHAR* SystemDrive,
;~ _Out_ DismSession* Session
;~ );Func DismOpenSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & "DismOpenSession" & @CRLF)
;~ ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)Global Const $tagSession = "UINT DismSession"
[/autoit][autoit][/autoit][autoit]Local $buffer = DLLStructCreate("WCHAR[200]")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Local $test = DllStructCreate($tagSession)
Local $bla = DllStructGetPtr($test)
;~ Local $blub = $tagSession
;~
Local $stString = DllStructCreate("wchar")
Local $ptrString = DllStructGetPtr($stString)
Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
"wstr", $sImagePath, _
"ptr", 0, _
"ptr", 0, _
"ptr", $ptrString _
)
;~ MsgBox(0, "DllCall", @error)
ConsoleWrite("DismOpenSession error: " & @error & @CRLF)
_ArrayDisplay($aResult, "DismOpenSession")
ConsoleWrite("DismOpenSession returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
ConsoleWrite($aResult[1] & @CRLF)
ConsoleWrite($aResult[2] & @CRLF)
ConsoleWrite($aResult[3] & @CRLF)
ConsoleWrite($aResult[4] & @CRLF)
ConsoleWrite("------" & @CRLF)
ConsoleWrite($ptrString & @CRLF)
Return $ptrString
EndFuncFunc DismInitialize()
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & "DismInitialize" & @CRLF)
Global Const $DismLogErrors = 0
Global Const $DismLogErrorsWarnings = 1
Global Const $DismLogErrorsWarningsInfo = 2
Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
"int", $DismLogErrorsWarnings, _
"ptr", 0, _
"ptr", 0 _
)
ConsoleWrite("DismInitialize error: " & @error & @CRLF)ConsoleWrite("DismInitialize returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
EndFuncFunc _DISM_Startup()
[/autoit][autoit][/autoit][autoit]
$giDISMRef += 1
If $giDISMRef > 1 Then Return SetExtended($ghdismapi, 0) ; dll already loadedIf Not FileExists($gsDismDLL) Then Return SetError(2, 0, -1) ; $gsWimDLL does not exist
[/autoit][autoit][/autoit][autoit]$ghdismapi = DllOpen($gsDismDLL) ; remember $ghwimgapi is Global
[/autoit]
ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)
If $ghdismapi = -1 Then Return SetError(1, 0, -1) ; Error opening dll
Return SetExtended($ghdismapi, 0) ; success!
EndFunc ;==>_WIM_StartupOutput:
ZitatAlles anzeigenDllOpen return: 1
--------------------------------DismInitialize
DismInitialize error: 0
DismInitialize returns: 0
DismGetMountedImageInfo error: 0
DismGetMountedImageInfo returns: 0
Mounted Image Count: 1
---
?¿0
0
0Allerdings ist auch der Aufbau des structs bei dismapi anders als bei wimgapi:
ZitatAlles anzeigentypedef struct _DismMountedImageInfo
{
PCWSTR MountPath;
PCWSTR ImageFilePath;
UINT ImageIndex;
DismMountMode MountMode;
DismMountStatus MountStatus;
}
DismMountedImageInfo; -
Hier nochmal das ganze File:
[autoit]#include-once
[/autoit][autoit][/autoit][autoit]#include <WinAPI.au3>
[/autoit][autoit][/autoit][autoit]
#include <Array.au3>Global Const $DISMAPI_E_INVALID_IMAGE_NAME = 0xC0040006 ; DismInitialize has already been called by the process without a matching call to DismShutdown.
[/autoit][autoit][/autoit][autoit]Global $gsDismDLL = "C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Deployment Tools\x86\DISM\dismapi.dll"
[/autoit][autoit][/autoit][autoit]
Global $ghdismapi = 0
Global $giDISMRef = 0;~ DllClose($dll)
[/autoit][autoit][/autoit][autoit]$aoutput = _DISM_Startup()
[/autoit][autoit][/autoit][autoit];~ MsgBox(0, "gfhdfgh", $aoutput & " " & _WinAPI_GetLastError())
[/autoit][autoit][/autoit][autoit]DismInitialize()
[/autoit][autoit][/autoit][autoit]
DismSession("C:\mount")Func DismSession($sImagePath);, $sWindowsDirectory = 0, $sSystemDrive = 0)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("DismOpenSession---------------------" & @CRLF)
Global Const $tagSession = "UINT DismSession"Local $buffer = DLLStructCreate("WCHAR[200]")
[/autoit][autoit][/autoit][autoit]
Local $test = DllStructCreate($tagSession)
Local $bla = DllStructGetPtr($test)
Local $blub = $tagSession
Local $stString = DllStructCreate("UINT")
Local $ptrString = DllStructGetPtr($stString)
Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
"ptr", $sImagePath, _
"ptr", 0, _
"wchar*", 0, _
"uint", $blub _;$ptrString _ ;DllStructGetPtr($tagSession) _
)
ConsoleWrite("error: " & @error & @CRLF)
_ArrayDisplay($aResult, "DismOpenSession")ConsoleWrite($bla & @CRLF)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & @CRLF)
EndFuncFunc DismInitialize()
[/autoit][autoit][/autoit][autoit]
Global Const $DismLogErrors = 0
Global Const $DismLogErrorsWarnings = 1
Global Const $DismLogErrorsWarningsInfo = 2
Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
"int", $DismLogErrorsWarnings, _
"ptr", 0, _
"ptr", 0 _
)
ConsoleWrite("error: " & @error & @CRLF)ConsoleWrite($aResult[0] & @CRLF) ; return S_OK -> 0 on success
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & @CRLF)
EndFuncFunc _DISM_Startup()
[/autoit][autoit][/autoit][autoit]
$giDISMRef += 1
If $giDISMRef > 1 Then Return SetExtended($ghdismapi, 0) ; dll already loadedIf Not FileExists($gsDismDLL) Then Return SetError(2, 0, -1) ; $gsWimDLL does not exist
[/autoit][autoit][/autoit][autoit]$ghdismapi = DllOpen($gsDismDLL) ; remember $ghwimgapi is Global
[/autoit]
If $ghdismapi = -1 Then Return SetError(1, 0, -1) ; Error opening dll
Return SetExtended($ghdismapi, 0) ; success!
EndFunc ;==>_WIM_StartupDas DLLCall 1 zurückgibt bedeutet
Zitat@error: 1 unable to use the DLL file
Kann die 1 auch durch falsche Parameter zurückgegeben werden???
Edit: Die Frage beantworte ich mal selber mit "JA". Hatte ja noch das "wchar" drin, das hat den @error 1 verursacht.
Aktuell sieht DismOpenSession so aus:
[autoit]Func DismOpenSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("--------------------------------" & "DismOpenSession" & @CRLF)
;~ ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)Global Const $tagSession = "UINT DismSession"
[/autoit][autoit][/autoit][autoit]Local $buffer = DLLStructCreate("WCHAR[200]")
[/autoit]
Local $test = DllStructCreate($tagSession)
Local $bla = DllStructGetPtr($test)
;~ Local $blub = $tagSession
;~
Local $stString = DllStructCreate("UINT")
Local $ptrString = DllStructGetPtr($stString)
Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
"ptr", $sImagePath, _
"ptr", $sWindowsDirectory, _
"ptr", DllStructGetPtr($sSystemDrive), _
"ptr", $ptrString _
)
;~ MsgBox(0, "DllCall", @error)
ConsoleWrite("DismOpenSession error: " & @error & @CRLF)
_ArrayDisplay($aResult, "DismOpenSession")
ConsoleWrite("DismOpenSession returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
ConsoleWrite($aResult[1] & @CRLF)
ConsoleWrite($aResult[2] & @CRLF)
ConsoleWrite($aResult[3] & @CRLF)
ConsoleWrite($aResult[4] & @CRLF)
;~ ConsoleWrite($stString & @CRLF)
;~ ConsoleWrite($ptrString & @CRLF)
EndFuncAutoIt stürzt dabei ab, aber sofern ich DismInitalize auskommentiere nicht mehr. Dann bekomm ich folgenden Output:
ZitatDismOpenSession error: 0
DismOpenSession returns: -1073479679
0x00000000
0x00000000
0x00000000
0x0417F150Danke!
-
Bin gleich zu Hause dann gehts weiter, aber sag mal, woher weisst du das S_OK -> 0 entspricht. Steht das irgendwo, hab ich was übersehen? Danke biks später jung

Edit:
[autoit]
DismInitialize gibt mir jetzt 0 zurück, demnach geh ich davon aus, dass diese Funktion richtig deklariert ist:Func DismInitialize()
[/autoit]
Global Const $DismLogErrors = 0
Global Const $DismLogErrorsWarnings = 1
Global Const $DismLogErrorsWarningsInfo = 2
Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
"int", $DismLogErrorsWarnings, _
"ptr", 0, _
"ptr", 0 _
)
ConsoleWrite("error: " & @error & @CRLF)
ConsoleWrite($aResult[0] & @CRLF) ; return S_OK -> 0 on success
ConsoleWrite("--------------------------------" & @CRLF)
EndFuncIch hab immernoch schwierigkeiten damit die DismOpenSession zum Laufen zu bekommen:
[autoit]DismSession("C:\mount")
[/autoit][autoit][/autoit][autoit]Func DismSession($sImagePath);, $sWindowsDirectory = 0, $sSystemDrive = 0)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("DismOpenSession---------------------" & @CRLF)
Global Const $tagSession = "UINT DismSession"$buffer = DLLStructCreate("WCHAR[200]")
[/autoit][autoit][/autoit][autoit]
$test = DllStructCreate($tagSession)
Local $bla = DllStructGetPtr($test)
Local $blub = $tagSession
Local $stString = DllStructCreate("UINT")
Local $ptrString = DllStructGetPtr($stString)
Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
"ptr", $sImagePath, _
"ptr", 0, _
"wchar*", 0, _
"ptr", $ptrString _ ;DllStructGetPtr($tagSession) _
)
ConsoleWrite("error: " & @error & @CRLF)
_ArrayDisplay($aResult, "DismOpenSession")ConsoleWrite($bla & @CRLF)
[/autoit]
ConsoleWrite("--------------------------------" & @CRLF)
EndFuncWenn ich, wie du sagst, statt "wchar*" -> "ushort" nehme, dann stürzt AutoIT ab. Habe einfach rumprobiert, aber sofern ich diese Zeile ändere, stürzt AutoIT ab. Außerdem ist @error immer 1
Hast du eine Idee? -
Hey funkey,
hab den Fehler beim DLL Call gefunden und weitere Funktionen deklariert, weiß aber mit dem Return nicht viel anzufangen.ZitatHRESULT WINAPI DismInitialize(
_In_ DismLogLevel LogLevel,
_In_opt_ PCWSTR LogFilePath,
_In_opt_ PCWSTR ScratchDirectory
);Beispiel:
[autoit][/autoit][autoit][/autoit][autoit]ZitatHRESULT hr = S_OK;
DismLogLevel Level = DismLogErrorsWarningsInfo;
hr = DismInitialize(Level, NULL, NULL);Global Const $DismLogErrors = 0
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global Const $DismLogErrorsWarnings = 1
Global Const $DismLogErrorsWarningsInfo = 2Func DismInitialize()
[/autoit][autoit][/autoit][autoit]
Local $test = DllStructCreate($DismLogErrorsWarningsInfo)
$test2 = DllStructGetPtr($test)
$test3 = $DismLogErrorsWarningsInfo
Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
"ptr", $test3, _
"wstr", 0, _
"wstr", 0 _
)
ConsoleWrite("error:" & @error & @CRLF)
;~ _ArrayDisplay($aResult)ConsoleWrite($aResult & @CRLF)
[/autoit]
ConsoleWrite($aResult[0] & @CRLF)
ConsoleWrite($aResult[1] & @CRLF)
ConsoleWrite($aResult[2] & @CRLF)
ConsoleWrite($aResult[3] & @CRLF)
ConsoleWrite($test3 & @CRLF)
ConsoleWrite("--------------------------------" & @CRLF)
EndFuncOutput:
Zitaterror:0
-2147024809
0x00000002
0
0
2Zitatenum DismLogLevel
{
DismLogErrors = 0,
DismLogErrorsWarnings = 1,
DismLogErrorsWarningsInfo = 2
};Bin mir nicht sicher, ob ich das DismLogLevel einfach so als Constante deklarieren kann und dann mit struct und pointer drauf im Funktionsaufruf des DLL Call verwenden kann...
ZitatHRESULT WINAPI DismOpenSession(
_In_ PCWSTR ImagePath,
_In_opt_ PCWSTR WindowsDirectory,
_In_opt_ WCHAR* SystemDrive,
_Out_ DismSession* Session
);Beispiel:
[autoit]ZitatHRESULT hr = S_OK;
DismSession Session = DISM_SESSION_DEFAULT;
hr = DismOpenSession(L"C:\\Mount\\", NULL, NULL, &Session);
[/autoit][autoit][/autoit][autoit]
DismSession("C:\mounted")
Func DismSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)
Global Const $tagSession = "UINT DismSession"
$buffer = DLLStructCreate("WCHAR[200]")
$test = DllStructCreate($tagSession)
Global $bla = DllStructGetPtr($test)
Global $blub = $tagSession
Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
"wstr", $sImagePath, _
"wstr", $sWindowsDirectory, _
"ptr", DllStructGetPtr($buffer), _
"ptr", $bla _ ;DllStructGetPtr($tagSession) _
)
ConsoleWrite("error:" & @error & @CRLF)
ConsoleWrite($aResult & @CRLF)
ConsoleWrite($aResult[0] & @CRLF)
ConsoleWrite($aResult[1] & @CRLF)
ConsoleWrite($aResult[2] & @CRLF)
ConsoleWrite($aResult[3] & @CRLF)
ConsoleWrite($aResult[4] & @CRLF)
;~ ConsoleWrite($test3 & @CRLF)
ConsoleWrite("--------------------------------" & @CRLF)_ArrayDisplay($aResult)
[/autoit]
EndFuncOutput:
Zitaterror:0
-1073479679
C:\mounted
0
0x03FD4B90
0x03FD0460Angeblich soll jeweils immer ein S_OK on Success zurückgegeben werden.
Von DismInitialize:
ZitatReturn Value
Returns S_OK on success.
Returns DISMAPI_E_DISMAPI_ALREADY_INITIALIZED if DismInitialize has already been called by the process without a matching call to DismShutdown.
Returns ERROR_ELEVATION_REQUIRED as an HRESULT if the process is not elevated.