2013-02-26 19 views
6

Ho scritto una libreria DLL con un sacco di funzioni e le classi in Visual Studio 2010. Quando guardo il contenuto del file con:nomi delle funzioni DLL utilizzando Dumpbin.exe

dumpbin.exe /EXPORTS myDll.dll 

ottengo lungo nomi delle funzioni con un qualche tipo di un puntatore a funzione posizione, che assomiglia a questo (seconda voce nel dll):

  2 1 0001100A [email protected]@[email protected]@[email protected] = @ILT+5([email protected]@[email protected]@[email protected]) 

questo è in qualche modo difficile da leggere, ma ho visto "più bello" lista procedura/funzione da altri. dll-s, come questo:

141 8C 00002A08 PogoDbWriteValueProbeInfo 

Come posso fare in modo che quella lista .dll sia così?

P.S .: il mio codice sorgente dll è simile al seguente:

namespace codecX 
{ 
    class codec 
    { 
     public: 
     static __declspec(dllexport) double Initialize(double a, double b); 
     ... 
+1

Sei sicuro di voler esportare nomi senza intoppi? Se lo fai, non sarai in grado di utilizzare l'overloading delle funzioni. Sembra che tu stia esportando una classe C++. Stai esportando metodi di istanza, costruttori ecc. Oppure tutti i tuoi metodi sono statici? –

+1

http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names –

+0

David H., sì, la mia intenzione era di esportare il formato leggibile dall'uomo. Perché? Ho bisogno di passare creato .dll ad altri colleghi e avere un formato leggibile è essenziale per una buona comprensione del codice sorgente e/o delle librerie scritte da qualcun altro. :) – TomiL

risposta

7

è necessario tirare le funzioni membro statiche nello spazio di indirizzi globale e poi avvolgere con extern "C". Ciò sopprimere il ++ nome mangling C e invece si darà C nome storpiatura che è meno brutto:

extern "C" __declspec(dllexport) Initialize(double a, double b) 
{ 
    codec::Initialize(a, b); 
} 

e quindi rimuovere il __declspec (dllexport) sulle funzioni membro statiche:

class codec 
{ 
    public: 
     static double Initialize(double a, double b); 
} 
+0

John, grazie per la tua risposta! Questo ha risolto il mio problema! – TomiL

3

Questo si chiama nome mangling e si verifica quando si compila C++ con un compilatore C++. Per conservare i nomi "leggibili" è necessario utilizzare extern "C" quando si dichiarano e si definiscono le proprie classi e le proprie funzioni. vale a dire

extern "C" void myFunction(int, int); 

Vedi here e anche google mixing C and C++.

+0

Hai coperto il maniscalco, ma hai omesso di menzionare la decorazione –

+0

@DavidHeffernan Siamo d'accordo che l'ho dimenticato, ok?)? Ma hai ragione, certo. –

+0

Bash.d, grazie per la tua risposta! Questo è quello di cui avevo bisogno! – TomiL

Problemi correlati