为什么草莓Perl不会叫我的DllMain?

时间:2012-09-16 21:44:59

标签: windows perl mingw strawberry-perl

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

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

我认为问题只是DllMain在使用gcc编译时未正确识别为DLL的入口点。但我不知道如何解决这个问题。

正在进行的工作在my GitHub repo for Win32::Setupsup。虽然我使用Dist::Zilla来管理版本,但实际上并不需要dzil来测试它。只需克隆回购,perl Makefile.PLdmake test

1 个答案:

答案 0 :(得分: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 ++名称重整)。