1

基本的な COM コンポーネントを作成しているので、それらの作成を練習できます。

PRIVATE キーワードを使用して、.def ファイルから DllRegisterServer、DllUnregisterServer、DllGetClassObject、および DllCanUnloadNow をエクスポートしています (Microsoft では必要だと思います)。

とにかく、extern "C" で 4 つの関数すべてを指定しましたが、まだマングリングが発生しています。これが私の.defです:

EXPORTS
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE

これはdumpbin /EXPORTSからのマングリングです

_DllCanUnloadNow@0
_DllGetClassObject@12
_DllRegisterServer@0
_DllUnregisterServer@0

extern "C" が役立つことは知っています。なぜなら、extern "C" を使用しないとマングリングが非常に悪くなるためです。

私のコンパイラは VC++ Express 2008 です。リンカー コマンド ライン:

/OUT:"G:\Programming\COM\BasicMathCOM\BasicMath\Release\BasicMath.dll" /INCREMENTAL:NO /NOLOGO /DLL /MANIFEST /MANIFESTFILE:"Release\BasicMath.dll.intermediate.manifest" /MANIFESTUAC:"レベル='asInvoker' uiAccess='false'" /DEBUG /PDB:"g:\Programming\COM\BasicMathCOM\BasicMath\Release\BasicMath.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE / NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

+/DEF:BasicMath.def、追加オプションの下に追加しました。

4

2 に答える 2

1

実際に .def ファイルを使用していますか?

コンパイルするコマンド ラインを確認できますか?

于 2009-12-15T04:17:37.303 に答える
1

申し訳ありませんが、修正しました。コマンド ラインを質問にコピーしていたときに、リリース構成を設定したにもかかわらず、/DEBUG が表示されました。Generate Debugging Info が誤ってオンになっていたことがわかったので、無効にして再コンパイルしました。名前のマングリングはなくなりました。

ご協力いただきありがとうございます。

于 2009-12-15T04:37:25.977 に答える