DLL Namens Export



  • Hallo,

    Bräuchte mal schnell eure Hilfe, habe folgenden Beispielcode:

    // dllmain.cpp : Defines the entry point for the DLL application.
    #define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
    // Windows Header Files:
    #include <windows.h>
    
    BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    
    extern "C"
    {
      __declspec(dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); 
    };
    
    void __stdcall RVExtension(char *output, int outputSize, const char *function)
    {
      outputSize -= 1;
      strncpy(output,function,outputSize);
    }
    

    Funktioniert auch, aber die Exportnamen in der DLL Stimmen nicht wie Sie vom eigentlichen Programm gefordert werden.

    Exportiert wird Sie mit "RVExtension", gefordert ist eigentlich ein Link mit "_RVExtension@12"

    In Delphi würde das ganze ja mit

    exports
      RVExtension name '_RVExtension@12';
    

    gehen, aber wie geht das in C++ ? kann ich irgendwo im C++ Builder eine manuelle DEF angeben damit ich die Links umbenennen kann?

    Hab auch schon die Aufrufkonvention geändert, leider ohne Erfolg. Standardwert ist C.

    Meine eigene DEF Datei würde so aussehen:

    LIBRARY rpcsocket
    EXPORTS
    	RVExtension = _RVExtension@12
    

    habe diese auch im Projekt eingefügt, aber wird ignoriert 😕

    Vielen Dank um Hilfe 😉



  • Sany1984 schrieb:

    Meine eigene DEF Datei würde so aussehen:

    LIBRARY rpcsocket
    EXPORTS
    	RVExtension = _RVExtension@12
    

    Tausche mal den rechten und linken Teil vom =.

    MfG Stephan



  • Moin 🙂

    und dann wird meine Def datei nicht mehr ignoriert?
    glaube ja fast nicht, das es echt an dem dreher liegt.

    aber lasse mich gerne überraschen.
    Reicht es denn wenn die Definition im Projekt hinzug3fügt wird.?

    gruss
    daniel



  • Sany1984 schrieb:

    und dann wird meine Def datei nicht mehr ignoriert?
    daniel

    So habe ich es zumindest für mich dokumentiert.
    Das hinzufügen sollte ausreichen.

    MfG Stephan



  • Hallo,

    Hab das mal eben getestet, leider kein erfolg, die Datei wird "ignoriert" Export der DLL erfolgt nach wie vor mit "RVExtension"... 😞



  • Ich glaube wir haben ein wenig aneinander vorbei gesprochen:

    1. Ich habe eine eigene Programmierte DLL in Borland C++, mit der geforderten Funktion "RVExtension"
    2. Das Programm das die DLL Lädt ist eine VC++ Applikation und möchte aber in meiner Borland DLL den Namen "_RVExtension@12" haben.

    Habe nun ein wenig herum experementiert, aber bin nicht wirklich weiter, wenn ich in den Projekteinstellungen in den Allgemeinen Compilierungseinstellungen den Parameter "Aufrufkonvention" auf __msfastcall ändere und den Code entsprechend so ändere:

    #pragma hdrstop
    #pragma argsused
    
    // dllmain.cpp : Defines the entry point for the DLL application.
    #define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
    // Windows Header Files:
    #include <windows.h>
    
    BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    	case DLL_THREAD_ATTACH:
    	case DLL_THREAD_DETACH:
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    
    extern "C" __declspec(dllexport) int _RVExtension(char *output, int outputSize, const char *function);
    
    int _RVExtension(char *output, int outputSize, const char *function)
    {
      outputSize -= 1;
      strncpy(output,function,outputSize);
    }
    

    Kriege ich als Exportierte funktion den namen "@_RVExtension@12" heraus, aber ich kriege das @ davor nicht weg.....



  • Das extern "C" ist nicht korrekt sofern du die __stdcall Namens/Aufrufkonvention nutzen willst. Das __declspec(dllexport) gehört (auch) in die Funktionsdefinition. Also:

    void __declspec(dllexport) __stdcall RVExtension(char *output, int outputSize, const char *function)
    {
      outputSize -= 1;
      strncpy(output,function,outputSize);
    }
    


  • Wieso muss es stdcall sein? Die Funktion hat ein reines C Interface und könnte gut auch so exportiert werden. Das muss dann nur noch in die Definition mit rein.

    extern "C" __declspec(dllexport) void RVExtension(char *output, int outputSize, const char *function)
    {
      outputSize -= 1;
      strncpy(output,function,outputSize);
    }
    

    Das @12 muss dann aber weg.



  • Hallo,

    Der Code beruht auf dem Beispiel Code des Spieleserver Developers, dieser ist in VC++ geschrieben, daher erwartet der Server das Spiele-Plugin als "_RVExtension@12" durch die Name Conversation Mangle geschichte.

    Den wie ich bereits gelesen habe, gibt Borland bei extern "C" nur Mangled Names als export raus, hab aber bereit im Embarcadero Forum schon evtl, hilfe gefunden, werde es hier posten falls es funktioniert mit der VC++ Geschichte... (Ich hasse VC++)


Anmelden zum Antworten