2013-02-26 17 views
6

Napisałem bibliotekę dll z dużą ilością funkcji i klas w Visual Studio 2010. Kiedy patrzę na zawartość pliku z:nazwy funkcji DLL przy użyciu dumpbin.exe

dumpbin.exe /EXPORTS myDll.dll 

mam długi nazwy funkcji z pewnego rodzaju wskaźnik lokalizacji funkcja, która wygląda następująco (drugim wpisie .dll):

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

to jakoś trudne do odczytania, ale widziałem „ładniejszy” listy procedura/funkcja od innych. dll-s, tak:

141 8C 00002A08 PogoDbWriteValueProbeInfo 

Jak mogę sprawić, aby ta lista .dll wyglądała w ten sposób?

P.S .: mój kod źródłowy dll wygląda następująco:

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

Czy na pewno chcesz wyeksportować niezmienione nazwy? Jeśli to zrobisz, nie będziesz w stanie korzystać z przeciążania funkcji. Wygląda na to, że eksportujesz klasę C++. Czy eksportujesz metody instancji, konstruktory itd. Czy wszystkie twoje metody są statyczne? –

+1

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

+0

David H., tak, moim zamiarem było wyeksportowanie formatu czytelnego dla człowieka. Czemu? Muszę przekazać utworzony plik .dll innym współpracownikom, a czytelny format jest niezbędny do dobrego zrozumienia kodu źródłowego i/lub bibliotek napisanych przez kogoś innego. :) – TomiL

Odpowiedz

7

trzeba wyciągnąć te statyczne funkcje składowe do globalnej przestrzeni adresowej, a następnie owinąć je extern „C”. Będzie to tłumić C++ nazwa przekręcona i zamiast dać nazwę C maglowania, która jest mniej brzydki:

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

a następnie usunąć __declspec (dllexport) na swoim statycznych funkcji składowych:

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

John, dziękuję za odpowiedź! To rozwiązało mój problem! – TomiL

3

To się nazywa wymienianie nazw i dzieje się, gdy kompilujesz C++ z kompilatorem C++. Aby zachować nazwy "czytelne dla czytelników", musisz zadeklarować i zdefiniować swoje klasy i swoje funkcje jako extern "C". tj

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

Zobacz here a także google mixing C and C++.

+0

Zakryłeś makrowanie, ale pominięto wzmiankę o dekoracji –

+0

@DavidHeffernan Zgadzamy się, że o tym zapomniałem, okej;)? Ale masz rację, oczywiście. –

+0

Bash.d, dziękuję za odpowiedź! Tego właśnie potrzebowałem! – TomiL

Powiązane problemy