gpt4 book ai didi

windows - Delphi DllMain DLL_PROCESS_DETACH 在 DLL_PROCESS_ATTACH 之前调用

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

我在处理用 Delphi 编写的 DLL 时遇到了很多麻烦。我已经使用库中的以下代码设置了一个 DllMain 函数:

begin
DllProc := DllMain;
end.

我的 DllMain 过程如下所示:

procedure DllMain(reason: Integer);
begin
if reason = DLL_PROCESS_DETACH then
OutputDebugString('DLL PROCESS DETACH')
else if reason = DLL_PROCESS_ATTACH then
OutputDebugString('DLL PROCESS ATTACH')
else if reason = DLL_THREAD_ATTACH then
OutputDebugString('DLL THREAD ATTACH')
else if reason = DLL_THREAD_DETACH then
OutputDebugString('DLL THREAD DETACH')
else
OutputDebugString('DllMain');
end;

我发现 DETACH 似乎在调用 ATTACH 之前被调用者(我无法控制)调用(两次?!)。这有可能吗,还是我误解了它应该如何工作?我的期望是每个 ATTACH 调用都会遇到匹配的 DETACH 调用,但情况似乎并非如此。

这是怎么回事?!

最佳答案

不幸的是,当在您的 dll 代码中执行 begin 时,操作系统已经在您的库中调用了 DllMain。所以当你的 DllProc := DllMain; 语句执行时已经太晚了。当 dll 附加到进程时,Delphi 编译器不允许执行用户代码。建议的解决方法(如果您可以称之为解决方法)是在单元初始化部分或库代码中自行调用您自己的 DllMain 函数:

begin
DllProc := DllMain;
DllMain(DLL_PROCESS_ATTACH);
end;

relevant documentation :

Note: DLL_PROCESS_ATTACH is passed to the procedure only if the DLL's initialization code calls the procedure and specifies DLL_PROCESS_ATTACH as a parameter.

关于windows - Delphi DllMain DLL_PROCESS_DETACH 在 DLL_PROCESS_ATTACH 之前调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10377343/

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