2

我正在尝试将Win32::Setupsup 移植到它使用的 Strawberry Perl 和 MinGW GCC,这是一个相当粗糙的基于 C++ 的旧模块,旨在与 Visual C++ 一起使用。除了一件事外,我几乎可以正常工作。

模块的 C++ 部分有一个DllMain函数,它运行一些初始化代码DLL_PROCESS_ATTACH和清理代码DLL_PROCESS_DETACH。当我用 Visual C++ 编译模块时,效果很好。但是当我使用 Strawberry Perl 使用的 MinGW GCC 编译它时,DllMain它永远不会被调用。

我认为问题只是DllMain在使用gcc. 但我不知道如何解决这个问题。

正在进行的工作在我的 Win32::Setupsup 的 GitHub 存储库中。虽然我使用Dist::Zilla来管理发布,但您实际上并不需要dzil对其进行测试。只需克隆 repoperl Makefile.PLdmake 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 回答