【问题标题】:Why doesn't Strawberry Perl call my DllMain?为什么 Strawberry Perl 不调用我的 DllMain?
【发布时间】:2012-09-16 21:44:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • extern "C" 有帮助吗?
  • @ephemient,做到了!而且它似乎也不打扰 Visual C++。把它写下来作为答案,我会接受的。

标签: windows perl mingw strawberry-perl


【解决方案1】:

看看你的代码,你有

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++ 名称修改)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2019-06-17
    • 2013-04-19
    • 2021-05-22
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多