2

私は、VisualC++で動作することを目的としたかなり無愛想な古いC++ベースのモジュールであるWin32::Setupsupを、StrawberryPerlとそれが使用するMinGWGCCに移植しようとしています。1つを除いて、ほとんど機能しています。

モジュールのC++部分には、で初期化コードを実行し、でクリーンアップコードDllMainを実行する関数があります。モジュールをVisualC++でコンパイルすると、正常に機能します。しかし、StrawberryPerlが使用するMinGWGCCでコンパイルすると、呼び出されることはありません。DLL_PROCESS_ATTACHDLL_PROCESS_DETACHDllMain

DllMain問題は、でコンパイルしたときにDLLのエントリポイントとして正しく識別されないことだけだと思いますgcc。しかし、私はそれを修正する方法がわかりません。

進行中の作業は、Win32::SetupsupのGitHubリポジトリにあります。Dist :: Zillaを使用してリリースを管理していますが、実際dzilにテストする必要はありません。リポジトリ、、、perl Makefile.PLおよびを複製するだけdmake testです。

4

1 に答える 1

2

コードを見ると、

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved);

C++ ソース ファイルで。これは C++ 関数であるため、G++ は名前を のようなものにマングルし__Z7DllMainP11HINSTANCE__mPv@12、ライブラリのロード時に見つけることができません。

これを解決するextern "C"には、関数宣言で

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved);

またはブロックで

extern "C" {
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved);
}

関数に C リンケージが与えられていることを確認します (C++ 名マングリングを回避します)。

于 2012-09-17T15:56:35.870 に答える