DLL soll string modifizieren



  • Hallo,

    ich habe folgendes Problem: ich möchte eine DLLFunktion die einen String manipuliert.

    dazu hab ich eine funktion in der DLL angelegt die folgendermaßen deklariert ist:

    extern "C" __declspec(dllexport)
    
    void ModuleInfo2(char* ptr)
    {
        //ptr modifizieren
    }
    

    In der DLL Header wird die Funktion exportiert:

    extern "C" __declspec(dllexport) void ModuleInfo2(char*);
    

    soweit so gut. Nun hab ich im Hauptprogramm einen Zeiger auf diese Funktion

    typedef						void (WINAPI*ModuleInfo)(char*);
    

    So nun lade ich die DLL und weise den Zeiger zu

    char		*mi;
    ModuleInfo	DLLmodinfo;
    
    HINSTANCE hLib=LoadLibrary(fullpath);
    if(hLib==NULL)
    {
        printf(" . . . could not load %s\n",modulename);
    } else
    {
        DLLmodinfo = (ModuleInfo)GetProcAddress(hLib, "ModuleInfo2");
        if (!DLLmodinfo==NULL)
        {
            mi = new char[100];
            DLLmodinfo(mi);
            delete [] mi;
        }
        //DLL unloaden usw...
    }
    

    So. und obwohl ich in der DLL Funktion mit dem Zeiger noch überhaupt nichts anstelle, stürzt das Programm wegen diverser Zugriffsverletzungen ab.

    Kann mir jemand sagen, wo genau der Fehler ist, bzw mich auf ein schönes Beispiel verweisen, wo DLL Funktionen mit Parametern vielleicht mal etwas allgemeiner abgehandelt werden?

    😕

    gruß



  • Du bringst die Aufrufkonventionen durcheinander.

    mc_ginley schrieb:

    typedef						void (WINAPI*ModuleInfo)(char*);
    

    Es soll also die WINAPI Aufrufkonvention verwendet werden. Das entspricht derzeit __stdcall. Beim Exportieren hast Du aber gar nichts angegeben. Deswegen wird aller Wahrscheinlichkeit nach __cdecl verwendet.

    Also mußt Du das WINAPI auch in Deiner Funktion angeben:

    extern "C" __declspec(dllexport)
    
    void WINAPI ModuleInfo2(char* ptr)
    {
        //ptr modifizieren
    }
    

    Und:

    extern "C" __declspec(dllexport) void WINAPI ModuleInfo2(char*);
    

    Wenn Du allerdings den VC verwendest, wird Dir spätestens der Aufruf von GetProcAddress NULL zurückgeben. Das liegt an der internen Darstellungsweise von __stdcall-Funktionen. Dabei wird der Funktionsname modifiziert. Damit die Funktion trotzdem unter diesem Namen exportiert werden, legst Du ein alias an. Das geschieht in dem Def-File, das Du einfach dem Projekt hinzufügst:

    EXPORTS
      ModuleInfo2
    


  • hat funktioniert, besten dank! 😃

    kannst du mir vielleicht noch ein paar infos zu diesem __declspec geben? was das soll, bzw was das bewirkt? das kommt mir alles so abstrakt vor.

    gruß und besten dank 🙂



  • Vielleicht ist das für dich interessant: http://www.resourcecode.de/view.php?id=776 🙂



  • Wenn Du allerdings den VC verwendest, wird Dir spätestens der Aufruf von GetProcAddress NULL zurückgeben. Das liegt an der internen Darstellungsweise von __stdcall-Funktionen. Dabei wird der Funktionsname modifiziert.

    IMHO wird das doch schon durch das extern "C" verhindert das der Funktionsname geändert wird.



  • Sorry. War falsch. Das galt nur für __cdecl.


Anmelden zum Antworten