我在处理用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呼叫,但情况似乎并非如此。
这里有什么东西?!
答案 0 :(得分:12)
不幸的是,当您的dll代码中执行begin
时,操作系统已在您的库中调用DllMain
。因此,当您的DllProc := DllMain;
语句执行时,已经太晚了。当dll附加到进程时,Delphi编译器不允许用户代码执行。建议的解决方法(如果您可以称之为解决方法)是在单元初始化部分或库代码中自己调用您自己的DllMain
函数:
begin
DllProc := DllMain;
DllMain(DLL_PROCESS_ATTACH);
end;
注意:仅当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而不是在编译时静态链接时。