dll import



  • ich hab hier jetzt mal den Code (bzw. Ausschnitte)... Könnte mir bitte jemand weiter helfen... siehe vorherige posts.

    --- main.cpp ----

    #include <stdlib.h>
    #include <windows.h>
    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    
    #define MAXMODULE 50
    
    void fuckoff ();
    
    char module[MAXMODULE];
    typedef void (WINAPI*cfunc)();
    
    cfunc hello_world;
    FOOPOINTER SetFooPointer;
    
    void load_plugin () {
       HINSTANCE hLib = LoadLibrary("lib.dll");
       if(hLib == NULL) {
          //g_print ("Unable to load library!\n");
          getch();
          //return 0;
       }
    
        GetModuleFileName((HMODULE)hLib, (LPTSTR)module, MAXMODULE);
       //g_print ("Library loaded: ");
       hello_world = (cfunc)GetProcAddress((HMODULE)hLib, "hello_world");
       SetFooPointer = (cfunc)GetProcAddress((HMODULE)hLib, "SetFooPointer");
       if((hello_world == NULL) | (SetFooPointer == NULL)) {
          //g_print ("Unable to load function");
          FreeLibrary((HMODULE)hLib);
          //return 0;
       }
    
       SetFooPointer (func_in_main);
        hello_world ();
    
         FreeLibrary((HMODULE)hLib);
       getch();
    }
    
    int WINAPI
    WinMain (HINSTANCE hThisInstance,
             HINSTANCE hPrevInstance,
             LPSTR lpszArgument,
             int nFunsterStil)
    {         
    [...]
    load_plugin ();
    return 0;
    }
    
    void func_in_main () {
    [...]
    }
    

    ----------------

    ----lib.cpp----

    #include <iostream.h>
    #include <stdio.h>
    #include <windows.h>
    
    typedef void (WINAPI *FOOPOINTER)(void);
    FOOPOINTER fuckoff = NULL;
    
    extern "C" __declspec(dllexport) void hello_world();
    
    #include "lib.h"
    
    void SetFooPointer (FOOPOINTER & f) {
       func_in_main = f;
    }
    
    extern "C" __declspec(dllexport) void hello_world () {
    [...]
    func_in_main ();
    }
    

    Grüße, Robert.

    Edit: Bitte benutze Codetags.

    [ Dieser Beitrag wurde am 24.01.2003 um 19:24 Uhr von cd9000 editiert. ]



  • Also aus dem was du gepostet hast werde ich nicht so recht schlau. Anscheinend weißt du selbst nicht so genau was du da eigentlich machst.

    void SetFooPointer (FOOPOINTER & f) {
       func_in_main = f;
    }
    

    Da weist du der nicht deklarierten Variable func_in_main den Wert von f zu (warum auch immer du da call by reference nimmst).

    Du solltest FOOPOINTER auch in der Exe bekannt machen. In der Lib ist das fehl am Platze; da wird kein FOOPOINTER gebraucht, eher cfunc. 🙂

    SetFooPointer = (cfunc)GetProcAddress((HMODULE)hLib, "SetFooPointer");
    

    Du weißt doch noch welche Signatur SetFooPointer in der lib hat? Genau, es hat einen Parameter, der übrigens cfunc und nicht FOOPOINTER sein sollte. 🙂
    Warum castest du dann nach cfunc und nicht nach FOOPOINTER?

    extern "C" __declspec(dllexport) void hello_world () {
        func_in_main ();
    }
    

    func_in_main ist der lib nicht bekannt... Benutz den Funktionzeiger!

    extern "C" __declspec(dllexport) void hello_world () {
        fuckoff();
    }
    

    Hatte ich schon erwähnt, dass fuckoff vom Typ cfunc sein muss?

    Und FOOPOINTER sollte so aussehen:

    typedef void (WINAPI * FOOPOINTER)(cfunc);
    

    Ist nicht böse gemeint, aber ich rate dir, dass du erstmal richtig C++ lernst. Besonders (Funktions-)Zeiger solltest du wiederholen, bevor du sowas in DLLs benutzen willst.

    btw:
    Warum um alles in der Welt bindest du <iostream.h>, <conio.h> und <stdio.h> in ein WinAPI-Programm ein? Das ist nicht wirklich sinnvoll, zumal du keine einzige Funktion daraus benutzt.

    2nd btw:
    Du darfst ruhig bessere Namen wählen. FOOPOINTER und cfunc sind bestimmt nur Beispiele, die man so nicht in richtigen Programmen einsetzen sollte.



  • *lol* Ich dachte, du wolltest eine DLL proggen. Wo ist denn der EntryPoint?



  • hier!!! 😡 😡 😡



  • 😃 Du kleiner I-d-i-o-t!



  • Man kann DLLMain auch weglassen. 🙂

    Kompiliert wirds trotzdem. Ich vermute es läuft sogar (ich hab nur kompilieren getestet). Logischerweise nur solange nicht irgendwelche Sachen initialisiert werden müssen.



  • siehste WebFritzi 😡 :p 🙂



  • Bitte lasst diesen Thread nicht in einen Flamewar ausarten, ok?



  • Flamewar? Nö! 😃



  • Servuus,
    ich muss jetzt mal ein großes Dankeschön an WebFriti und cd aussprechen.
    Eure beiden Beiträge zusammen haben mir viel gebracht. Ich denke ich hab jetzt auch ne Menge dazugelernt:)

    Viele Grüße,
    Robert.


Anmelden zum Antworten