在DLL_PROCESS_ATTACH之前调用Delphi DllMain DLL_PROCESS_DETACH

aar*_*rkk 9 windows delphi dll

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

begin
  DllProc := DllMain;
end.
Run Code Online (Sandbox Code Playgroud)

我的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;
Run Code Online (Sandbox Code Playgroud)

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

什么在这里??!

Ser*_*yuz 12

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

begin
  DllProc := DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end;
Run Code Online (Sandbox Code Playgroud)

相关文件:

注意:仅当DLL的初始化代码调用过程并将DLL_PROCESS_ATTACH指定为参数时,DLL_PROCESS_ATTACH才会传递给过程.