DllCallbacks in DllStructs als Datentyp

  • Hallo Autoit-ler,
    heute habe ich ein mehr oder weniger großes Problem, was ich allein wohl leider nicht zu überwinden vermag. Mein Problem ist folgendes:
    Ich muss ein DllStruct erstellen, in welchem ein DllCallback als Datentyp angegeben werden muss. Ich habe ein explizites Beispiel vorliegen:
    Hier also der Code für den Struct in C-Code:


    Dabei ist zum Beispiel fmod_pcmreadcallback ein callback. Dessen Code habt ihr hier, in c/c++ code:

    Code
    FMOD_RESULT F_CALLBACK FMOD_SOUND_PCMREADCALLBACK(
      FMOD_SOUND *  sound, 
      void *  data, 
      unsigned int  datalen
    );


    Ich bin mir sicher, dass ich nah am Durchblick bin, aber im Moment habe ich noch ein Brett vorm Kopf... wie kann ich das ungefähr realisieren? Bitte helft mir ;). Danke schonmal im Vorraus.
    mfg.
    Timtam

  • Hallo Timtam,
    ich habe es nicht ausprobiert und ich finde auch nichts über diese merkwürdigen Dateitypen. Aber hilft dir ja der Denkansatz. Die Parameter müssen bestimmt auch noch angepasst werden.

    Meistens übergeben Programme einen Pointer auf den Start der Funktionen. Diesen kriegst du über DllCallbackGetPtr (zur Sicherheit konvertiere ich ihn oft zu einer Zahl; ich hatte schon viele Bugs damit).

    Spoiler anzeigen
    [autoit]

    $pCallback = DllCallbackRegister("FMOD_SOUND_PCMREADCALLBACK", "dword", "dword;ptr;dword")
    $pStruct = DllStructCreate("dword")
    DllStructSetData($pStruct, 1, Number(DllCallbackGetPtr($pCallback)))
    MsgBox(0, "hi", Number(DllCallbackGetPtr($pCallback)))

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

    Func FMOD_SOUND_PCMREADCALLBACK($sound, $data, $datalen)
    ;was auch immer hier reinkommt
    EndFunc

    [/autoit]


    Vielleicht klappts ja ;)

  • Hi,
    Danke für deine schnelle Hilfe.
    Wenn ich das mal verallgemeinere würde das also heißen, dass ich den Struct erstelle und anstelle der FMOD_pcmreadcallback geschickte einen ptr anlege. Anschließend registriere ich den callback und gebe in das Element mit dem ptr-Platz einen pointer auf die registrierte Callbackfunktion rein? Wenn das so ist, habe ich es jetzt verstanden :). Falls nicht... dann denke ich falsch xD.
    mfg.

  • Zitat

    Wenn ich das mal verallgemeinere würde das also heißen, dass ich den Struct erstelle und anstelle der FMOD_pcmreadcallback geschickte einen ptr anlege. Anschließend registriere ich den callback und gebe in das Element mit dem ptr-Platz einen pointer auf die registrierte Callbackfunktion rein?


    Ja, so meinte ich das auch. Allerdings brauchst du - nur zum Verständniss - nur eine Dllstruct, falls du jetzt vorhattest extra eine neue Struct zu erstellen. Was für einen Datentyp du brauchst, kann ich dir leider auch nicht sagen, aber Ptr klingt schon mal gut^^

    "Eigentlich" ist es ja egal, welchen Datentyp man nimmt - hauptsache er ist groß genug und die Daten werden korrekt geschrieben. Theoretisch sollte sogar Dword funktionieren (weil genauso groß wie ein Pointer), aber da ich das noch nicht oft benutzt habe weiss ich das nicht genau.

  • "Eigentlich" ist es ja egal, welchen Datentyp man nimmt - hauptsache er ist groß genug und die Daten werden korrekt geschrieben. Theoretisch sollte sogar Dword funktionieren (weil genauso groß wie ein Pointer), aber da ich das noch nicht oft benutzt habe weiss ich das nicht genau.


    DWORD funktioniert nur auf 32bit-Systemen. Auf 64bit ist ein PTR größer. Nimm immer den korrekten Datentype und nicht irgend einen passenden. Bei Callbacks wird immer ein Pointer verwendet.