DllStructCreate für DllCall

  • Hallo zusammen,

    ich versuche seit einigen Tagen die Struktur in AutoIt für einen DllCall abzubilden.

    Meine bisherigen Versuche sehen wie folgt aus:

    Alle Varianten führten bisher zum Absturz des Scriptes.

    Mit "long vmID" und "AccessibleContext accessibleContext" kann ich ohne Probleme die Element-Info's auslesen (z.B. Name, Rolle etc.). Somit schließe ich diese Parameter als Fehlerquelle aus.

    Danke und viele Grüße

    Espyre

    • Offizieller Beitrag

    Bei der dritten Struktur habe ich keinen Plan, was mit JOBJECT64 für ein Datentyp gemeint ist.

    Anfangen würde ich so:

    Laut Definition ist actionInfo ein Array von Pointern auf die Struktur AccessibleActionInfo, ich hoffe das klappt so.

  • Danke, der Aufruf führt zumindest zu keinem Fehler. Leider enthält er mMn auch nicht die gewünschten Daten.

    Nach meinem Verständnis sollte bei an Anzahl "1" rauskommen und beim Namen der Aktion "click" oder so ähnlich.

    JavaMonkey2.pngJavaMonkey.png


    Ich hole mal eben aus, wie ich zu den benötigten Daten für den Aufruf komme.

    Ich habe bisher zwei Möglichkeiten gefunden, ein Object in der Applikation zu identifizieren. Mit Koordinaten oder über den Tree von JavaMonkey. Die zweite Variante habe ich im Einsatz.

    Ich hoffe die Informationen helfen weiter.

    Da ich noch relativ unerfahren mit DllCalls bin, kann natürlich auch eine falsche Interpretation meinerseits der Fehler sein :)

    Danke und viele Grüße

    Espyre

    • Offizieller Beitrag

    Da werde ich später nochmal drüber schauen, Dll ist meist mit etwas Probieren verbunden und wenn man dann nicht selbst auf die Dll zugreifen kann, weiß man auch nicht ob die Überlegungen in die richtige Richtung gehen.

    Ich habe vor Jahren mal die Nutzung von Arraystrukturen bei Dll in eine kleine Funktionssammlung gepackt. Vielleicht kannst du damit etwas anfangen: Arrays als Dll-Elemente


    EDIT

    $sAC_Info = DllCall($g_hAccessBridgeDll, 'BOOL:cdecl', 'getAccessibleContextInfo','long', $vmId, 'long', $acElement, 'struct*', $tAccessibleContextInfo)

    Funktioniert dieser Aufruf?

    struct*, $tAccessibleContextInfo soll einen Pointer auf $tAccessibleContextInfo legen.

    Falls der Aufruf nicht funktioniert kannst du auch probieren:

    ptr, DllStructGetPtr($tAccessibleContextInfo)


    EDIT-2

    ich vermute mal, mit dem Byte-Array solltest du zum Ziel kommen, in etwa so:

  • EDIT

    Funktioniert dieser Aufruf?

    struct*, $tAccessibleContextInfo soll einen Pointer auf $tAccessibleContextInfo legen.

    Ja, der funktioniert einwandfrei.


    Ich habe für den Test jetzt ein Textfeld anstatt des Buttons genommen. Das Textfeld hat 56 actions.

    Dein Beispiel hat anscheinend funktioniert.

    Wenn ich _WinAPI_DisplayStruct($a_actionInfo[0]) ausführe, findet man auch die 56.

    a_actionInfo_0.PNG

    Vielen Dank Bugfix. Ich versuche jetzt deinen Code zu verstehen und mit der Struct weiter zu arbeiten. Damit möchte ich dann im nächsten Schritt eine bestimmte Aktion ausführen.

    Viele Grüße

    Espyre