2011-01-25 7 views
7

可能性の重複:
How do I stop name-mangling of my DLL's exported function?Unmangling C++ DLL関数名

私はC++で書かれているDLLを持っています。エクスポートされた関数名は、取り除かれる必要があります。たとえば、int MyFunc(int Param1, int Param2);は、外部アプリケーションにライブラリ関数を呼び出すときには、単にMyFuncと表示する必要があります。しかし、Dependency Walkerを使って見ると、[email protected]のように見えます。

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

を私はextern "C"は、トリックを行うだろうと思った:これは、私はそれがC++で宣言されてきた方法です。どうやってマングリングを取り除くのですか?ありがとう。

+0

.defファイルは、トリックを行う必要があります。 – ruslik

+2

は重複していますか? http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function – MerickOWA

+0

役に立つリンク - http://msdn.microsoft.com/en- US/library/x7kb4e2f(v = VS.80).aspx – MerickOWA

答えて

8

方法:(MSVCは、ビルド環境であると仮定した場合)

エクスポート.DEFファイルを経由して。

extern "C"としてエクスポートして、__cdecl呼び出し規約が使用されていることを確認します。 extern "C"が使用されている場合でも、__stdcallは_の前に_を付け、dllのエクスポート関数に@を後置します。

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

#pragmaディレクティブを使用してエクスポートします。あなたはこれの反対側に完全に混乱した名前を渡す必要があります。上で、そして

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

__FUNCDNAME__は、として定義し、ヘッダ(.H)上の装飾名を一覧表示する機能マクロに配置するための有用な指示、

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

'extern" C "は' __cdecl'呼び出し規約が使用されていることを保証していますか? –

+0

extern "C"は、シンボルがCコードと互換性があることを保証するだけです。__cdeclと__stdcallは、完全に装飾されたC++関数に適用できる個別のディレクティブです –

+1

関数宣言の直前にプラグマを置く必要がありますか? –

2

これはおそらく、extern "C" declspecを関数定義に入れなかったからです。これは宣言の上に置くだけです。マングリングを取り除くため

+0

宣言と定義の両方にあります。 –

0

あります関数の実装(.CPP):

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

かっこを使用して行う必要がありますか? 'extern" C "' inclineは同じことをしないと宣言していますか? –

+0

@Jimあなたは大丈夫ですが、大括弧は必要ありません。私は完全性のためにそれを入れました。 – karlphillip

3

先頭下線および@8の接尾辞はC++ネームのmanglingではなく、stdcallの呼び出し規約を示します。これは通常のようにdllexportです。ヌーシステムで

+0

どうすればそれらを取り除くことができますか? –

+0

呼び出し規則を変更しないように呼び出し規則を変更します。 –

+0

__cdecl conventionを試してください。 – ThomasMcLeod

0

C++ filtの

+0

そしてWindowsでは 'undname'です。しかし、問題はそれを解読していないマングリングを止めることです。 – Rup

関連する問題