1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Trolleule1337

Beiträge von Trolleule1337

  • If...Then Mehrere Statements per Zeile

    • Trolleule1337
    • 16. Februar 2013 um 00:28

    Leider immer noch nicht...ContinueLoop

  • If...Then Mehrere Statements per Zeile

    • Trolleule1337
    • 16. Februar 2013 um 00:05

    minx

    ContinueLoop klappt nicht. Ne Idee?

    PainTain

    Wir lassen uns überraschen, scheinst aber gewonnen zu haben!

  • If...Then Mehrere Statements per Zeile

    • Trolleule1337
    • 15. Februar 2013 um 23:37

    Sehr kreativ, aber wie würdest du das hier in eine Zeile zaubern?

    [autoit]

    If $curElement = "" Then $e += 1 & ContinueLoop

    [/autoit]
  • If...Then Mehrere Statements per Zeile

    • Trolleule1337
    • 15. Februar 2013 um 23:01

    Okay anderer Versuch:

    [autoit]

    If StringInStr($aStDataTypes[$e], "PTR") <> 0 Then
    $curElement = DllStructGetData(DllStructCreate("WCHAR [260]", DllStructGetData($getPackageInfo, $e)), 1)
    If $curElement = "" Then $e += 1 & ContinueLoop ; ?????????????

    [/autoit][autoit][/autoit][autoit]

    EndIf

    Switch $index
    ...
    ...
    ...
    $e += 1

    [/autoit]

    Wenn $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?

  • If...Then Mehrere Statements per Zeile

    • Trolleule1337
    • 15. Februar 2013 um 19:52

    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!

  • If...Then Mehrere Statements per Zeile

    • Trolleule1337
    • 15. Februar 2013 um 19:15

    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!

  • DLLCall - Ausgabe eines structs, welches als Element ein struct beinhaltet, klappt! Elegante Lösung zum Auslesen der Daten gesucht

    • Trolleule1337
    • 7. Februar 2013 um 15:46

    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)

    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]))

    [/autoit][autoit][/autoit][autoit]

    $DriverPackage = $aResult[3]
    $Count = $aResult[4]

    [/autoit][autoit][/autoit][autoit]

    Local $aReturn[$Count][$aParams]
    For $i = 1 To $Count
    $tmp_tagDismDriverPackage &= $tagDismDriverPackage
    If $i = $Count Then ExitLoop
    $tmp_tagDismDriverPackage &= ";"
    Next

    [/autoit][autoit][/autoit][autoit]

    Local $stString = DllStructCreate($tmp_tagDismDriverPackage, $DriverPackage)

    [/autoit][autoit][/autoit][autoit]

    $k = 0

    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

    [/autoit][autoit][/autoit][autoit]

    ; free resources
    _DISM_Delete($stString)
    _DISM_Delete($tmp_stString)

    _Arraydisplay($aReturn)
    Return SetExtended(_WinAPI_GetLastError(), $aReturn)
    EndFunc ;==>_DISM_GetDrivers

    [/autoit]

    Das 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!

  • DLLCall - Ausgabe eines structs, welches als Element ein struct beinhaltet, klappt! Elegante Lösung zum Auslesen der Daten gesucht

    • Trolleule1337
    • 6. Februar 2013 um 21:18

    HAHAH fuck man, du bist genial Andy! Es klappt! Aber ich dachte wirklich er gibt mir den Pointer von dem struct SYSTEMTIME zurück, ist aber nicht so! Jetzt sehen die anderen Elemente auch schon viel besser aus!

    Danke!!! :love:

  • DLLCall - Ausgabe eines structs, welches als Element ein struct beinhaltet, klappt! Elegante Lösung zum Auslesen der Daten gesucht

    • Trolleule1337
    • 6. Februar 2013 um 19:49

    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:
    Meine Definition vom DismDriverPackage struct:

    [autoit]

    ; DismDriverPackage
    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"

    [/autoit]

    Dateien

    dismapi.rar 3,61 kB – 169 Downloads
  • DLLCall - Ausgabe eines structs, welches als Element ein struct beinhaltet, klappt! Elegante Lösung zum Auslesen der Daten gesucht

    • Trolleule1337
    • 6. Februar 2013 um 17:42

    Hey Leute,
    die Funktion, die ich definiert habe verwendet die DISM API und ruft folgende Funktion darin auf:

    Zitat

    HRESULT WINAPI DismGetDriverInfo (
    _In_ DismSession Session,
    _In_ PCWSTR DriverPath,
    _Outptr_result_buffer_(*Count) DismDriver** Driver,
    _Out_ UINT* Count,
    _Out_opt_ DismDriverPackage** DriverPackage
    );

    Alles anzeigen

    Das zurückgegeben struct sieht so aus:

    Zitat

    typedef 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;

    Alles anzeigen

    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:

    [autoit]

    ; #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"

    [/autoit]


    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]))

    [/autoit][autoit][/autoit][autoit]

    ;~ _ArrayDisplay($aResult)

    [/autoit][autoit][/autoit][autoit]

    $DriverPackage = $aResult[3]
    $Count = 1;$aResult[4]

    [/autoit][autoit][/autoit][autoit]

    Local $aReturn[$Count][$rParams]
    For $i = 1 To $Count
    $tmp_tagDismDriverPackage &= $tagDismDriverPackage
    If $i = $Count Then ExitLoop
    $tmp_tagDismDriverPackage &= ";"
    Next

    [/autoit][autoit][/autoit][autoit]

    Local $stString = DllStructCreate($tmp_tagDismDriverPackage, $DriverPackage)
    ConsoleWrite("error: " & @error & @CRLF)
    _DLLStructDisplay($stString, $tmp_tagDismDriverPackage)

    [/autoit][autoit][/autoit][autoit]

    $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

    [/autoit][autoit][/autoit][autoit]

    ; free resources
    _DISM_Delete($stString)
    _DISM_Delete($tmp_stString)

    _Arraydisplay($aReturn)
    Return SetExtended(_WinAPI_GetLastError(), $aReturn)
    EndFunc ;==>_DISM_GetDrivers

    [/autoit]

    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!

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 3. Februar 2013 um 16:25

    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 = ^ ERROR

    Habs 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 :(:):love:

    Danke jung!


    Edit:
    Die anderen Werte bekomme ich dann so:

    [autoit]

    ConsoleWrite(DllStructGetData ($mii, 3) & @CRLF)
    ConsoleWrite(DllStructGetData ($mii, 4) & @CRLF)
    ConsoleWrite(DllStructGetData ($mii, 5) & @CRLF)

    [/autoit]
  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 3. Februar 2013 um 02:44

    Egal was ich probiere ich bekomme immer den selben output:

    Zitat

    0x0066CDC0
    0x03D909A0
    0
    0
    0
    leer
    leer

    Alles anzeigen

    $Return[0] = DllStructGetData($wchar, 1) ist leer
    $Return[1] = DllStructGetData($wchar2, 1) ist auch leer

    Könnte es vllt. an folgender Remark liegen:

    Zitat

    The array of DismMountedImageInfo structures are allocated by the DISM API on the heap.

    DismMountedImageInfo Structure

    Zitat

    typedef struct _DismMountedImageInfo
    {
    PCWSTR MountPath;
    PCWSTR ImageFilePath;
    UINT ImageIndex;
    DismMountMode MountMode;
    DismMountStatus MountStatus;
    }
    DismMountedImageInfo;

    Alles anzeigen

    Hier nochmal nachzulesen: DismGetMountedImageInfo Function

    Hier nochmal der code:

    [autoit]

    ; Function Call
    ;~ HRESULT WINAPI DismGetMountedImageInfo(
    ;~ _Outptr_result_buffer_(*Count) DismMountedImageInfo** MountedImageInfo,
    ;~ _Out_ UINT* Count
    ;~ );

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismGetMountedImageInfo()
    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]

    Local $Count
    Local $Return[7]

    Local $wchar = DllStructCreate("WCHAR[260]")
    Local $ptrwchar = DllStructGetPtr($wchar)

    Local $wchar2 = DllStructCreate("WCHAR[260]")
    Local $ptrwchar2 = DllStructGetPtr($wchar2)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"
    ;~ ConsoleWrite($tagDismMountedImageInfo & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ;~ MsgBox(0, "sadfaf", $tagDismMountedImageInfo)

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"

    Local $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
    DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
    DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2)
    Local $pDismMountedImageInfo = DllStructGetPtr($tDismMountedImageInfo)

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
    "ptr", $pDismMountedImageInfo, _
    "uint*", $Count _
    )
    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)

    [/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")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    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
    ConsoleWrite($Return[5] & @CRLF)
    ConsoleWrite($Return[6] & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]


    Hast du ne idee champ? :(

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 2. Februar 2013 um 13:16

    Klappt leider nicht. Output ist leer. Hast du eine Idee?

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 2. Februar 2013 um 03:41

    Hey danke, schau mal bitte:

    [autoit]

    Func DismGetMountedImageInfo()
    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]


    ;~ $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]

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ Local $tWIM_MOUNT_LIST = DllStructCreate($tagDismMountedImageInfo) ; & ";" & $tagDismMountedImageInfo)
    ;~ Local $pWIM_MOUNT_LIST = DllStructGetPtr($tWIM_MOUNT_LIST)
    ;~
    Local $test

    [/autoit][autoit][/autoit][autoit]

    $wchar = DllStructCreate("WCHAR[260]")
    $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)

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
    "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)

    [/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)
    ;~ _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

    [/autoit]

    Output:

    Zitat

    --------------------------------DismGetMountedImageInfo
    DismGetMountedImageInfo error: 0
    DismGetMountedImageInfo returns: 0
    Mounted Image Count: 1
    ---
    0x00E9DD28
    0x03D80970
    0
    0
    0

    Alles anzeigen

    Wo habe ich was vergessen?

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 1. Februar 2013 um 19:41

    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 :love:

    So?

    [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"

    [/autoit]

    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!

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 1. Februar 2013 um 18:53

    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:

    Zitat

    typedef struct _DismMountedImageInfo
    {
    PCWSTR MountPath;
    PCWSTR ImageFilePath;
    UINT ImageIndex;
    DismMountMode MountMode;
    DismMountStatus MountStatus;
    }
    DismMountedImageInfo;

    Alles anzeigen
  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 1. Februar 2013 um 17:57

    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>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    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"
    Global $ghdismapi = 0
    Global $giDISMRef = 0

    [/autoit][autoit][/autoit][autoit]

    ;~ DllClose($dll)

    [/autoit][autoit][/autoit][autoit]

    $aoutput = _DISM_Startup()

    [/autoit][autoit][/autoit][autoit]

    ;~ MsgBox(0, "gfhdfgh", $aoutput & " " & _WinAPI_GetLastError())

    [/autoit][autoit][/autoit][autoit]

    DismInitialize()
    ;~ $session = DismOpenSession("C:\mount")
    DismGetMountedImageInfo()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ HRESULT WINAPI DismGetMountedImageInfo(
    ;~ _Outptr_result_buffer_(*Count) DismMountedImageInfo** MountedImageInfo,
    ;~ _Out_ UINT* Count
    ;~ );

    [/autoit][autoit][/autoit][autoit]

    Func DismGetMountedImageInfo()

    Global Const $DismReadWrite = 0
    Global Const $DismReadOnly = 1

    Global Const $DismMountStatusOk = 0
    Global Const $DismMountStatusNeedsRemount = 1
    Global Const $DismMountStatusInvalid = 2

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagDismMountedImageInfo = "WCHAR MountPath[260];WCHAR ImageFilePath[260];UINT ImageIndex;Int DismMountMode;Int MountStatus"


    Local $Return[10]

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $tWIM_MOUNT_LIST = DllStructCreate($tagDismMountedImageInfo) ; & ";" & $tagDismMountedImageInfo)
    Local $pWIM_MOUNT_LIST = DllStructGetPtr($tWIM_MOUNT_LIST)

    Local $tImageInfoCount = DllStructCreate("UINT")
    Local $pImageInfoCount = DllStructGetPtr($tImageInfoCount)
    Local $test

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
    "ptr", $pWIM_MOUNT_LIST, _
    "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)
    ;~ ConsoleWrite($lol & @CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Return[0] = DllStructGetData($tWIM_MOUNT_LIST, 1)
    $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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ HRESULT WINAPI DismOpenSession(
    ;~ _In_ PCWSTR ImagePath,
    ;~ _In_opt_ PCWSTR WindowsDirectory,
    ;~ _In_opt_ WCHAR* SystemDrive,
    ;~ _Out_ DismSession* Session
    ;~ );

    [/autoit][autoit][/autoit][autoit]

    Func DismOpenSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)
    ConsoleWrite("--------------------------------" & "DismOpenSession" & @CRLF)
    ;~ ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    Local $buffer = DLLStructCreate("WCHAR[200]")
    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
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismInitialize()
    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)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite("DismInitialize returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _DISM_Startup()
    $giDISMRef += 1
    If $giDISMRef > 1 Then Return SetExtended($ghdismapi, 0) ; dll already loaded

    [/autoit][autoit][/autoit][autoit]

    If Not FileExists($gsDismDLL) Then Return SetError(2, 0, -1) ; $gsWimDLL does not exist

    [/autoit][autoit][/autoit][autoit]

    $ghdismapi = DllOpen($gsDismDLL) ; remember $ghwimgapi is Global
    ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)
    If $ghdismapi = -1 Then Return SetError(1, 0, -1) ; Error opening dll
    Return SetExtended($ghdismapi, 0) ; success!
    EndFunc ;==>_WIM_Startup

    [/autoit]


    Output:

    Zitat

    DllOpen return: 1
    --------------------------------DismInitialize
    DismInitialize error: 0
    DismInitialize returns: 0
    DismGetMountedImageInfo error: 0
    DismGetMountedImageInfo returns: 0
    Mounted Image Count: 1
    ---
    ?¿

    0
    0
    0

    Alles anzeigen

    Allerdings ist auch der Aufbau des structs bei dismapi anders als bei wimgapi:

    Zitat

    typedef struct _DismMountedImageInfo
    {
    PCWSTR MountPath;
    PCWSTR ImageFilePath;
    UINT ImageIndex;
    DismMountMode MountMode;
    DismMountStatus MountStatus;
    }
    DismMountedImageInfo;

    Alles anzeigen
  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 1. Februar 2013 um 14:54

    Hier nochmal das ganze File:

    [autoit]

    #include-once

    [/autoit][autoit][/autoit][autoit]

    #include <WinAPI.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    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"
    Global $ghdismapi = 0
    Global $giDISMRef = 0

    [/autoit][autoit][/autoit][autoit]

    ;~ DllClose($dll)

    [/autoit][autoit][/autoit][autoit]

    $aoutput = _DISM_Startup()

    [/autoit][autoit][/autoit][autoit]

    ;~ MsgBox(0, "gfhdfgh", $aoutput & " " & _WinAPI_GetLastError())

    [/autoit][autoit][/autoit][autoit]

    DismInitialize()
    DismSession("C:\mount")

    [/autoit][autoit][/autoit][autoit]

    Func DismSession($sImagePath);, $sWindowsDirectory = 0, $sSystemDrive = 0)
    ConsoleWrite("DismOpenSession---------------------" & @CRLF)

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    Local $buffer = DLLStructCreate("WCHAR[200]")
    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")

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($bla & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismInitialize()

    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)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($aResult[0] & @CRLF) ; return S_OK -> 0 on success
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _DISM_Startup()
    $giDISMRef += 1
    If $giDISMRef > 1 Then Return SetExtended($ghdismapi, 0) ; dll already loaded

    [/autoit][autoit][/autoit][autoit]

    If Not FileExists($gsDismDLL) Then Return SetError(2, 0, -1) ; $gsWimDLL does not exist

    [/autoit][autoit][/autoit][autoit]

    $ghdismapi = DllOpen($gsDismDLL) ; remember $ghwimgapi is Global
    If $ghdismapi = -1 Then Return SetError(1, 0, -1) ; Error opening dll
    Return SetExtended($ghdismapi, 0) ; success!
    EndFunc ;==>_WIM_Startup

    [/autoit]

    Das 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)
    ConsoleWrite("--------------------------------" & "DismOpenSession" & @CRLF)
    ;~ ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    Local $buffer = DLLStructCreate("WCHAR[200]")
    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)
    EndFunc

    [/autoit]

    AutoIt stürzt dabei ab, aber sofern ich DismInitalize auskommentiere nicht mehr. Dann bekomm ich folgenden Output:

    Zitat

    DismOpenSession error: 0
    DismOpenSession returns: -1073479679
    0x00000000
    0x00000000
    0x00000000
    0x0417F150


    Danke!

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 1. Februar 2013 um 12:47

    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:
    DismInitialize gibt mir jetzt 0 zurück, demnach geh ich davon aus, dass diese Funktion richtig deklariert ist:

    [autoit]

    Func DismInitialize()

    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)
    EndFunc

    [/autoit]


    Ich 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)
    ConsoleWrite("DismOpenSession---------------------" & @CRLF)

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    $buffer = DLLStructCreate("WCHAR[200]")
    $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")

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($bla & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit]

    Wenn 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?

  • DLL Call - Dism API DismOpenSession

    • Trolleule1337
    • 1. Februar 2013 um 03:25

    Hey funkey,
    hab den Fehler beim DLL Call gefunden und weitere Funktionen deklariert, weiß aber mit dem Return nicht viel anzufangen.

    DismInitialize Function

    Zitat

    HRESULT WINAPI DismInitialize(
    _In_ DismLogLevel LogLevel,
    _In_opt_ PCWSTR LogFilePath,
    _In_opt_ PCWSTR ScratchDirectory
    );

    Beispiel:

    Zitat

    HRESULT hr = S_OK;
    DismLogLevel Level = DismLogErrorsWarningsInfo;
    hr = DismInitialize(Level, NULL, NULL);

    [autoit][/autoit][autoit][/autoit][autoit]

    Global Const $DismLogErrors = 0
    Global Const $DismLogErrorsWarnings = 1
    Global Const $DismLogErrorsWarningsInfo = 2

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismInitialize()

    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)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($aResult & @CRLF)
    ConsoleWrite($aResult[0] & @CRLF)
    ConsoleWrite($aResult[1] & @CRLF)
    ConsoleWrite($aResult[2] & @CRLF)
    ConsoleWrite($aResult[3] & @CRLF)
    ConsoleWrite($test3 & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit]

    Output:

    Zitat

    error:0
    -2147024809
    0x00000002
    0
    0
    2

    DismLogLevel Enumeration

    Zitat

    enum 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...

    DismOpenSession Function

    Zitat

    HRESULT WINAPI DismOpenSession(
    _In_ PCWSTR ImagePath,
    _In_opt_ PCWSTR WindowsDirectory,
    _In_opt_ WCHAR* SystemDrive,
    _Out_ DismSession* Session
    );

    Beispiel:

    Zitat

    HRESULT hr = S_OK;
    DismSession Session = DISM_SESSION_DEFAULT;
    hr = DismOpenSession(L"C:\\Mount\\", NULL, NULL, &Session);

    [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)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($aResult)
    EndFunc

    [/autoit]

    Output:

    Zitat

    error:0
    -1073479679
    C:\mounted
    0
    0x03FD4B90
    0x03FD0460

    Angeblich soll jeweils immer ein S_OK on Success zurückgegeben werden.

    Von DismInitialize:

    Zitat

    Return 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.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™