2

MSVC2010 に、DLL ラッパーを作成する C++ コードのセクションがあります。コードのセクションは次のようになります...

extern "C" __declspec(dllexport) DWORD myDllExportFunction()
{
    return (DWORD)SomeFunction(SomeParameter);
}

また...

_declspec(dllexport) int64 _stdcall myDllExportFunction2(<someType> someParameter){
{
    return new (DWORD)SomeExternalFunction(SomeParameter);
}

この dll でダンプビンを実行すると、エクスポート セクションに完全修飾関数名だけが含まれることが予想されますが、このように見えます。

 _myDllExportFunction@12 = _myDllExportFunction@12

この等号がなぜそこにあるのか、それが何を意味するのかわかりません。dllをインポートするプログラムは、本来の機能を実行していないため、関数にアクセスできないと強く感じています。

十分な情報を提供するために、コンパイラとリンカーのスイッチの一部を含めました

コンパイラ オプション:

/Zi /nologo /Wall /WX- /O2 /Ob2 /Oi /Oy- /D "_WINDLL" /D "_MBCS" /D "_AFXDLL" /Gm- /EHsc /GS /fp:precise /Zc:wchar_t /Zc

リンカー オプション:

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\....\MyProj.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\....\MyProj.pgd" /TLBID:1 /DYNAMICBASE:NO /NXCOMPAT:NO /IMPLIB:"MyProj.lib" /MACHINE:X86 /ERRORREPORT:QUEUE 

注: /IMPLIB:"MyProj.lib" -> このインポート ライブラリには、DLL に入れたい形式で DLL に入れたいすべてのエクスポートが含まれています。

プロジェクトのオプションに、これを引き起こす設定はありますか? 過去数年間に、見逃した可能性のある dllexport への変更はありましたか? 私の問題を理解するのに役立つ情報はありますか?

4

4 に答える 4

2

デバッグ情報の生成をオフにしてみてください。

ここに画像の説明を入力

于 2011-09-30T17:34:42.030 に答える
0

__stdcallおそらく別の宣言で、名前を宣言することで名前を台無しにしました。__cdecl名前のマングリングを避けるために、呼び出し規約を指定する必要があります。

于 2011-09-30T17:37:47.427 に答える
0

エクスポートされた関数の名前を制御したい場合 (たとえば、マングリングを削除するため)、リンカーモジュール定義 ( .def) ファイルを使用する必要があります。

于 2011-09-30T17:44:27.563 に答える
0

名前のマングリングを防ぐためのオプションがいくつかあります。

  • エクスポートされた関数の宣言指定子を から __stdcallに変更し__cdeclます。したがって、関数のシグネチャは次のようになります

    extern "C" DWORD __declspec(dllexport) __cdecl myDllExportFunction()

呼び出し規約を使用する必要がある場合__stdcallは、次の 2 つの方法のいずれかを使用して名前マングリングを回避します。どちらの場合も__declspec(dllexport)、関数定義に追加する必要はありません (追加しても問題ありません)。

  • 行を含むプロジェクトに .def ファイルを追加します。

LIBRARY YourLibraryName
EXPORTS
    myDllExportFunction

  • プロジェクトのプロパティで、[リンカー] -> [コマンド ライン] に移動し、[追加オプション]の編集ボックスに追加します。/export:myDllExportFunction
于 2011-09-30T18:09:31.070 に答える