Announcement

Collapse
No announcement yet.

dll mit Callback

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • dll mit Callback

    Hallo,
    ich versuche innerhalb einer dll eine callback function zu implementieren, die mir eine zugewiesene Funktion in meiner Hauptanwendung triggert. Natürlich will ich diesen "Event" an beliebigen Stellen innerhalb der dll triggern. Wenn möglich will ich auch keine lib einbinden, sondern mit GetProcAddress arbeiten.
    Das hier ist der eingedampfte code aus der dll:
    Code:
    //a normal function I call from the main application:
    extern "C" __declspec(dllexport) void funcA(const unsigned long long a, const unsigned long long b);
    //following function should be the callback, triggering an assigned function in the main application
    extern "C"
    {
        typedef void(__stdcall* callback_t)(unsigned int halfbeast);
    
        __declspec(dllexport) void public_func_taking_callback(callback_t evHnd)
        {
            evHnd(333);//value just for testing
        }
    }
    
    
    void funcA(
        const unsigned long long a,
        const unsigned long long b)
    {
        //some code here... do things with a and b
       if(a>10)                       //trigger the event in the main application
           callback_t(public_func_taking_callback);   
    }
    Und hier nun mein code aus der Hauptanwendung:

    Code:
    typedef void (__stdcall *eventCallback)(unsigned int miau);
    typedef void (__stdcall *setCallback)(eventCallback evHnd);
    void __stdcall CallB(unsigned int);
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    signed int retval;
    unsigned int i;
    char txt[7];
    unsigned long long a,index;
    UnicodeString USt;
    HINSTANCE dllHandle=NULL;
    
    //Obtain a handle to the DLL
    dllHandle = LoadLibrary(L"test.dll");
    if (!dllHandle){
        ShowMessage("Could not load test.dll");
        Form1->Close();
        }
    else{    //Lib was loaded, try to get data
        void (__stdcall* funcA)(const unsigned long long a, const unsigned long long b);  
        funcA=(void(__stdcall*)(const unsigned long long a, const unsigned long long b))GetProcAddress(dllHandle,"funcA");
    
        // DLL function pointer
        setCallback values=(setCallback)GetProcAddress(dllHandle, "public_func_taking_callback");
        if(values != NULL){
            values(&CallB);
            }
    
        if(!funcA){
            Memo1->Text="No handle to function found.";
            }
        else{
            funcA(1,1);
            funcA(100,100);
            }
        FreeLibrary(dllHandle);
        }
    
    }
    //---------------------------------------------------------------------------
    void __stdcall CallB(unsigned int halfbeast){
    ShowMessage("triggered");
    }
    //---------------------------------------------------------------------------
    Compilieren tut das ganze ohne weiteres, aber mit derm Callback stimmt was nicht... leider verstehe ich nicht was.
    1.) Sobald die Zeile values(&CallB) ausgeführt wird, wird CallB gerufen. Wollte ich eigentlich nicht, sondern ja nur den Callback pointer meiner Funktion CallB zuweisen
    2.) Wenn ich funcA(100,100) rufe, triggered das NICHT CallB(). Also muss was am Aufruf in der dll faul sein.




  • #2
    Ok, mittlerweile klappt es. Hier die Lösung für alle die es eventuell mal brauchen:
    Code:
     //a normal function I call from the main application:
    extern "C" __declspec(dllexport) void funcA(const unsigned long long a, const unsigned long long b);
    
    //following function should be the callback, triggering an assigned function in the main application
    extern "C" {    
         typedef void(__stdcall* callback_t)(unsigned int halfbeast);    
         static callback_t s_user_function = nullptr; // variable used to store the user function address      
    
         __declspec(dllexport) void public_func_taking_callback(callback_t evHnd)     {        
              s_user_function = evHnd; // save the callback address for funcA    
             }
    }  
    void funcA(     const unsigned long long a,     const unsigned long long b) {    
        //some code here... do things with a and b    
       if(a > 10 && s_user_function != nullptr)                       //trigger the event in the main application        
           s_user_function(333+a); // call the user function  
    }
    Zuletzt editiert von bodo2407; 16.04.2021, 15:18. Reason: Editierung des codes wurde komplett zerschossen und in eine Zeile gepackt...

    Comment

    Working...
    X