gpt4 book ai didi

delphi - 将 delphi win32 应用程序转换为库和 FreeLibrary 卡住

转载 作者:行者123 更新时间:2023-12-03 18:59:34 28 4
gpt4 key购买 nike

我有一个应该转换为库的应用程序。我只复制了项目 dpr 并更改了源文件:

library aLibrary;
uses
FastMM4,
Forms,
SysUtils,
Windows,
Mainfrm in 'Mainfrm.pas' {Mainform};
{$R *.res}
Procedure DllMain(Reason: Integer);
Begin
If Reason = DLL_PROCESS_ATTACH Then
Begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
ExitCode := 0;
End;
If Reason = DLL_PROCESS_DETACH Then
Begin
Application.Terminate;
MainForm.Free;
End;
End;
Begin
DllProc := @DllMain;
DllProc(DLL_PROCESS_ATTACH);
End.

如您所见,我只是删除了与应用程序初始化相关的通常自动生成的代码行并将它们放入 DllMain 过程中,将“程序”关键字更改为“库”。
dll 加载良好,嵌入式程序也运行良好,但我无法在主机进程中释放它(FreeLibrary)。无论 DLL_PROCESS_DETACH 代码是什么,dll 都会卡住(即使在这种情况下没有放置任何内容)。

释放所有应用程序的正确方法是什么?

最佳答案

你在做太多了在您的 DLL 过程中。

在加载 DLL 时,操作系统会获取加载程序锁。这可以防止同时加载任何其他库。如果您调用尚未加载的库中的函数,则将触发加载该库的尝试。由于您仍在加载程序锁内,因此其他库在尝试获取锁本身时会阻塞,并且您会出现死锁。类似的规则适用于卸载。

您应该在 DllMain 函数中执行绝对最小值来加载或卸载您的库。将其他所有内容留给 DLL 主机可以在加载完成后或即将开始卸载之前调用的单独函数。在您的情况下,最小值可能根本没有。

关于delphi - 将 delphi win32 应用程序转换为库和 FreeLibrary 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125746/

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