2011-01-25 21 views
7

Olası Çoğalt:
How do I stop name-mangling of my DLL's exported function?Unmangling C++ DLL Fonksiyon İsimleri

C++ ile yazılmış bir DLL var. Dışa aktarılan işlev adlarının unmangled olması gerekir. Örneğin, int MyFunc(int Param1, int Param2); kütüphane işlevini çağırmaya çalışan bir dış uygulamaya göründüğünde, yalnızca MyFunc olarak görünmelidir. Ancak, Dependency Walker kullanarak baktığımda, [email protected] gibi görünüyor. Bu ben C++ ilan ettiler nasıl:

extern "C" __declspec(dllexport) int WINAPI MyFunc(int Param1, int Param2); 

ben extern "C" hile yapacağını düşündü. Managonu nasıl kurtarabilirim? Teşekkürler.

+0

bir def dosya hile yapmak gerekir yoktur. – ruslik

+2

yinelenen? http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function – MerickOWA

+0

ayrıca yararlı link - http://msdn.microsoft.com/en- ABD/kitaplık/x7kb4e2f (v = VS.80) .aspx – MerickOWA

cevap

8

Yolları bozma kurtulmak için: bir .def dosyası ile

İhracat (MSVC varsayarak inşa ortamıdır). __cdecl çağrı kuralı kullanıldığından emin olarak "C" extern olarak dışa aktarın. __stdcall, ex "C" kullanıldığında bile _c'yi dışa aktarılan işlevlere _p değerini ekler ve sonradan gönderir. Bir # Pragma yönergesi kullanılarak

extern "C" __declspec(dllexport) int __cdecl MyFunc(int Param1, int Param2); 

İhracat. Bunun tam tersi olarak adlandırılmış adı geçmelisin. üzerine, Sonra

extern "C" 
{ 
    __declspec(dllexport) int __stdcall MyFunc(int Param1, int Param2); 
} 

: __FUNCDNAME__ olarak tanımlamak, başlığında (.h) On onun dekore adını listelemek için bir işlevde bir makroda koymak için yararlı bir yönerge,

#pragma comment(linker, "/EXPORT:[email protected]"); 
+0

Dışardan "C", "__cdecl" çağrı kuralının kullanıldığından emin mı, yoksa bu iki ayrı şey mi? –

+0

"C" ekseni sadece sembolün C kodu ile uyumlu olmasını sağlar.__cdecl ve __stdcall, tamamen dekore edilmiş C++ işlevlerine uygulanabilecek ayrı yönergelerdir –

+1

Pragma, işlev bildiriminden hemen önce mi olmalıdır? –

2

Muhtemelen, işlev tanımına extern "C" declspec koymadığınız için, bunu yalnızca bildirime koydunuz.

+0

Hem bildirim hem de tanım üzerindedir. –

0

olduğunu fonksiyonunun uygulanması (cpp):

extern "C" 
{ 
    __declspec(dllexport) int __stdcall MyFunc(int Param1, int Param2) 
    { 
    // ... code ... 
    } 
} 
+0

Köşeli ayraçlar kullanılarak yapılmalı mı? "Extern" C "iniş ilan etmek aynı şeyi yapmıyor mu? –

+0

@Jim Haklısınız, parantezlere ihtiyacınız yok. Sadece bütünlük adına söylüyorum. – karlphillip

3

lider çizgi ve @8 son eki, C++ adlandırma denetiminden değil, daha çok dllexport için olduğu gibi stdcall çağrı kuralını gösterir. Gnu sistemlerinde

+0

Tamam. Onlardan nasıl kurtulurum? –

+0

Arama kuralınızı bu tür bir karışma yapmayan birime değiştirin. –

+0

__cdecl sözleşmesini deneyin. – ThomasMcLeod

0

C++ filt

+0

Ve Windows üzerinde 'undname'. Ama soru, manglingin çözülmesini engellemeyle ilgili. – Rup