windows - Delphi DllMain DLL_PROCESS_DETACH 在 DLL_PROCESS_ATTACH 之前调用

标签 windows delphi dll

我在处理用 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/

相关文章:

c# - 将 DLL 合并到程序集或嵌入到资源中 - 哪个更好?

windows - 添加/删除程序中缺少修复工具是否表示不是基于 MSI 的安装?

.net - 从 Windows 通过 Entity Framework 连接到 Informix 的问题

mysql - 德尔福、dbExpress 和 UTF8

delphi - Firebird TIBQuery 插入并返回 ... INTO

c++ - Mac/c++ 上的 ChaiScript std lib 在运行时寻找 dll

c# - 从线程调用的 ActiveX DLL

windows - 批量 IF 变量比较神秘地不起作用

c# - 应用程序可以在手动运行时保存文件,但在由任务计划程序运行时不能

rest - 德尔福 10.1 : How to get JSON string stored in the body parameter of a REST request (TCustomRESTRequest. 主体)?