Exportierte Funktionsnamen ohne "_" oder Typinformationen



  • Hallo,

    ich versuche gerade ein Plugin (DLL) für den Notepad++ Editor zu erstellen, allerdings will NP++ das Plugin nicht laden, weil er die Funktion "isUnicode" über GetProcAddress() nicht findet. Sitze schon stundenlang an dem Problem und hab erst jetzt gemerkt, dass der C++Builder (XE2) die Funktionsnamen mit einem "_" versieht. Eigentlich sollte das so aussehen (Funktionsnamen aus einem anderen Plugin exportiert):

    LIBRARY     NPPEXPORT.DLL
    
    EXPORTS
        beNotified                     @1   ; beNotified
        getFuncsArray                  @2   ; getFuncsArray
        getName                        @3   ; getName
        isUnicode                      @4   ; isUnicode
        messageProc                    @5   ; messageProc
        setInfo                        @6   ; setInfo
    

    Die exportierten Namen in der von C++Builder erstellten DLL sehen aber so aus:

    LIBRARY     CCC.DLL
    
    EXPORTS
        ___CPPdebugHook                @7   ; ___CPPdebugHook
        _beNotified                    @4   ; _beNotified
        _getFuncsArray                 @3   ; _getFuncsArray
        _getName                       @2   ; _getName
        _isUnicode                     @6   ; _isUnicode
        _messageProc                   @5   ; _messageProc
        _setInfo                       @1   ; _setInfo
    

    Die findet der NP++ natürlich nicht, da dort ein Unterstrich hinzugefügt wurde. Nehme ich das 'extern "C"' aus meinen Deklarationen raus und aktiviere die Option "Projekt -> Optionen -> C++ Compiler -> Ausgabe -> Exportierten Symbolen keinen Unterstrich voranstellen" bekomme ich sowas raus:

    LIBRARY     CCC.DLL
    
    EXPORTS
        @beNotified$qp14SCNotification @4   ; beNotified(SCNotification *)
        @getFuncsArray$qpi             @3   ; getFuncsArray(int *)
        @getName$qv                    @2   ; getName()
        @isUnicode$qv                  @6   ; isUnicode()
        @messageProc$quiuil            @5   ; messageProc(unsigned int, unsigned int, long)
        @setInfo$q7NppData             @1   ; setInfo(NppData)
        ___CPPdebugHook                @7   ; ___CPPdebugHook
    

    Compiliere ich über Delphi oder VC++, funktioniert es prima. Hab hier im Forum diesen Thread gefunden und darüber diesen Artikel aber das hilft mir nicht wirklich weiter. Der NP++ möchte die Funktion über GetProcAddress(..., "isUnicode"); ansprechen, aber die verstümmelten Namen findet er eben nicht und ich habe auf den NP++ keinen Einfluß.

    Kann mir bitte jemand helfen? Das müsste doch bestimmt nur irgendeine Option sein.

    PS: Hier das Testprojekt (vom Beispiel-Template übernommen): TestPlugin.zip



  • Oh man... läuft jetzt. 🙄
    Musste noch __stdcall einfügen. Also: extern "C" __declspec(dllexport) __stdcall BOOL isUnicode()


Anmelden zum Antworten