在DLL_PROCESS_ATTACH之前调用Delphi DllMain DLL_PROCESS_DETACH

时间:2012-04-30 00:51:48

标签: 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;

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

这里有什么东西?!

2 个答案:

答案 0 :(得分:12)

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

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

relevant documentation

  

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

答案 1 :(得分:-1)

  

我发现,在调用ATTACH之前,调用者(我无法控制)似乎会调用DETACH(两次?!)。

根据"编程Windows第5版"由Petzold 应用程序启动时会调用DLL_PROCESS_ATTACH DLL_THREAD_ATTACH当启动附加应用程序中的新线程时。{ 当附加到您的应用程序的应用程序退出时,将调用DLL_PROCESS_DETACH 当附加应用程序中的线程退出时,将调用DLL_THREAD_DETACH

请注意,DLL_THREAD_DETACH可以在没有相应的早期DLL_THREAD_ATTACH的情况下进行调用。
当线程之前启动到链接到dll的应用程序时会发生这种情况 这主要发生在应用程序使用LoadLibrary手动加载dll而不是在编译时静态链接时。