gpt4 book ai didi

windows - 为什么 Strawberry Perl 不调用我的 DllMain?

转载 作者:可可西里 更新时间:2023-11-01 10:27:11 25 4
gpt4 key购买 nike

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

该模块的 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 来测试它。只需克隆存储库、perl Makefile.PLdmake test

最佳答案

看看你的代码,你有

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);

或在一个 block 中

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

确保函数被赋予 C 链接(避免 C++ 名称重整)。

关于windows - 为什么 Strawberry Perl 不调用我的 DllMain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12450997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com