Callback ohne Windowsfenster



  • Ich muss Sachen in einer DLL neuprogrammieren. Dafür muss ich eine Thread erstellen, mit dem ich im Backend nach bestimmten Bedingungen Frage.
    Dem Thread sollen von aussen verschiedene Anfragen an das Backend gestellt werden. Wenn der Thread nun die Antworten vom Backend bekommen hat, soll dieser die per Callback an den Caller zurückgeben.

    Den Thread brauche ich damit eine Anfrage nicht den kompletten Prozees belegt.

    Hatt jemand Erfahrung darin, und kann mir mal ein paar Befehle, oder Konstruckte als Beispiel bringen? Meine Bücher und Google sind da völlig untauglich für, bei MSDN zu schauen macht auch erst Sinn wenn ich die Grundlage verstanden habe. Am wichtigsten währe mir eine Beschreibung zu haben wie das ganze genau funktioniert, damit ich die Wirkungsweise nachvollziehen kann.

    Danke Peer



  • Hi,

    Wo ist das Problem ?

    Du kannst doch deinen Thread (beispielsweise) folgenden Struktur übergeben:

    struct SThreadData
    {
       long lIrgwas;
       void (__cdecl* InternalCallback) (int iArg1, int Arg2); // Parameter usw. musst du noch anpassen ;-)
       // Hier möglichweise weitere Elemente...abhängig von deiner Situation...
    };
    

    Der Thread kann dann die Daten auswerten (falls überhaupt nötig) und ruft dann die mit 'InternalCallback' adressierte Funktion auf (die dann deine "Callback ohne Windowsfenster"-Funktion darstellt)... 😉 .



  • Erstmal danke!

    hier noch eine Frage:

    __cdecl* ist ein standart Typ? oder sebst definiert? Schuldigung aber Zeiger auf Funktionen lösen noch einen argen Knoten in meinem Kopf aus.

    Gruß Peer



  • Ja, Funktionszeiger können einen schon mal derbst verwirren^^

    Zu __cdecl: Ja, ist ein Standard-Typ. Ist ne Aufrufkonvention, in welcher Reihenfolge die Parameter übergeben werden. In der Regel immer __cdecl, bei den Windows-Callbacks meistens __stdcall.



  • Nightstorm @home schrieb:

    __cdecl* ist ein stan**** Typ? oder sebst definiert?

    __cdecl ist ein Schlüsselwort 😉 . (Meine Güte dieses beschissene Forum stürzt andauernd ab, echt nervig 😡 )

    Nightstorm @home schrieb:

    Schuldigung aber Zeiger auf Funktionen lösen noch einen argen Knoten in meinem Kopf aus.

    Jo, dazu villeicht

    Eine Erklärung:
    Der Prozessor arbeitet deinen Code (-> Maschinencode, eben den Binärcode) ab. Wenn er jetzt auf
    einen Funktionsaufruf trifft, (egal welchen, ist bei allen gleich) steht dort -abstrakt betrachtet- nur eine
    Adresse, die auf den Funktionsdefinitionscode verweißt. Darauf hin springt der Prozessor mit der
    Bearbeitung über diese besagte Adresse zur Definition der Funktion und sichert dabei die Rücksprungadresse
    (eben da, von wo er 'gesprungen' ist) auf einem Speicher (das sogenannte Stack). Dieses Stack arbeitet
    nach dem s.g. LIFO-Prinzip: Last-In-First-Out. Es bedeutet also, dass das letzte Element, welches hinzugefügt
    wurde immer als erstes entfernt wird. Dann wird der Funktionscode abgearbeitet und anschließend wird wieder
    (über, die auf dem Stack gespeicherte Rücksprungadresse) zum Ausgangscode verzweigt.
    ➡ Ob du also eine Funktion 'namentlich' aufrufst, oder nur ihre Adresse 'hinschreibst' ist also egal 😉 .

    Hoffe mal das war verständlich, wenn nit kannste ja nochmal fragen 😉 .



  • jetzt hat es endlich klick geunktionen hier immer void *arg übergeben wird, das hat mit dem was du erklärst zu tun... Man jetzt hast du gerade den größten Knoten in meinem Knopf enwirrt. Das heisst nähmlich das ich auf auf Funktionen in dem Aufrufenden Prozess greifen kann, obwohl die noch nicht dran währen. Super ...Danke.

    Gruß Peer



  • Nightstorm schrieb:

    Das heisst nähmlich das ich auf auf Funktionen in dem Aufrufenden Prozess greifen kann,obwohl die noch nicht dran währen. Super ...Danke.

    Also was du damit zum Ausdruck bringen willst, musst du aber nochmal erläutern ...Huh!? 🤡

    PS: Wer nämlich mit 'h' schreibt ist nett 😃 .



  • Nightstorm @home schrieb:

    __cdecl* ist ein stan**** Typ?

    Nein. __cdecl ist weder ein Typ, noch standardisiert. Es ist einfach ein Schlüsselwort, welches die Aufrufkonvention angibt. Der Typmodifikator für Zeiger (*) bezieht sich hier übrigens nicht auf __cdecl, sondern auf die gesamte Funktionssignatur, was als Ergebis einen Funktionszeiger zur Folge hat.



  • Jo hast recht ist n Schlüsselwort (ist das eigentlich Standard ?), wird übrigens in MV C++ blau gefärbt 😃 .



  • CodeFinder schrieb:

    ist das eigentlich Standard ?

    Wie ich bereits sagte, nein. Weder im C noch C++ Standard ist dieses Schlüsselwort spezifiziert.



  • Sry, habs überlesen, my fault 😉 .


Anmelden zum Antworten