2010-12-12 6 views
3

Ich habe eine D-DLL, die von einem C++ - Programm geladen wird, das ich nicht kontrollieren kann. Das Programm LoadLibrarys my DLL und verwendet GetProcAddress, um eine Funktion mit dem Namen "extension_load" zu finden, die ein Argument (einen Zeiger) benötigt. In meinem D DLL Ich habe:Exportierte Funktion Symbol Name Mangling

extern (C) int extension_load(void* ptr) { 
    return 0; 
} 

Und dieser Name als extension_load exportiert werden muss, sondern als extension_load wird @ 4 exportiert, so GetProcAddress nicht finden können. Wie mache ich es einfach extension_load ohne den Namen mangling?

+0

Und findet GetProcAddress * nicht * die Funktion? Woher kommt die 'extension_load @ 4' (dh wie hast du herausgefunden, dass es dieser Name war)? – jpalecek

+0

@jpalecek, Sorry, ich dachte es wäre impliziert. GetProcAddress findet die Funktion nicht unter dem Namen extension_load. Das @ 4 kommt von der Länge aller Argumente in Bytes, und ich weiß extension_load @ 4 ist, was es gerade exportiert wird, weil, wenn ich den Prozess mit einem Debugger öffne und die Zeichenfolge im Speicher ändere, um extension_load @ 4 zu sein, die Funktion gefunden. –

Antwort

5

Sie müssen den Linker mit einer .def-Datei versehen, die den Export umbenennt. Docs are here, benötigen Sie EXPORTE.

+0

Ich bin brandneu in D und ich habe keine Ahnung, wie Sie den Linker mit einer .def-Datei versehen, die den Export umbenennt. Ich kenne die Befehlszeilenoptionen nicht einmal. –

+0

Nun, betrachten Sie es als eine gute Gelegenheit, mehr darüber zu lernen. Ihre Frage ist nicht detailliert genug für mich zu sagen, ob Sie eine Art von IDE verwenden oder von Hand bauen. Durchsuchen Sie die Website, mit der ich verlinkt habe, auch auf dem Linker. –

4

Ich habe es mit etwas Hilfe von Hans Passant Link funktioniert. Hier ist meine DEF-Datei für jeden, der es in Zukunft brauchen wird (wahrscheinlich selbst auch):

EXETYPE NT 

EXPORTS 
    extension_load 
    DllMain 

Die DEF-Datei ich habe, ist dll.def genannt. Ich habe die Funktion geschrieben wie:

extern (C++) int extension_load(void* ptr) { 

und die IDE ich benutze, ist D-IDE, so der Linker die def-Datei zu geben, gehen Sie zu Projekt> Eigenschaften> Build-Optionen und geben

nameofdef.def 

im Textfeld Zusätzliche Verknüpfungsargumente. Dies setzt voraus, dass der Namedefdef.def-Datei in Ihrem Hauptprojektverzeichnis für D-IDE zu finden ist.

1

Es gibt wirklich keine Notwendigkeit für eine Def-Datei. prepend einfach Ihre Funktionen mit export, z.B .:

export extern (C) int extension_load(void* ptr) { 
    return 0; 
} 

Und kompilieren über: dmd -ofmydll.dll mydll.d. Natürlich müssen Sie auch DllMain() definieren.