我有一个应该转换为库的应用程序.我只复制了项目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.
Run Code Online (Sandbox Code Playgroud)
如您所见,我只是删除了与应用程序初始化相关的通常自动生成的代码行,并将它们放入DllMain过程中,将"program"关键字更改为"library".dll加载得很好,嵌入式程序也运行良好,但我无法在主机进程中设法释放它(FreeLibrary).无论DLL_PROCESS_DETACH代码是什么,dll都会冻结(即使在这种情况下没有任何内容).
什么是释放所有应用程序的正确方法?
你在DLL程序中做得太多了.
在加载DLL时,OS获取加载程序锁.这可以防止同时加载任何其他库.如果调用尚未加载的库中的函数,则会触发尝试加载该库.由于您仍在加载程序锁定内部,因此其他库在尝试获取锁定时会阻塞,并且您会遇到死锁.类似的规则适用于卸载.
您应该在DllMain函数中执行绝对最小值以使您的库加载或卸载.将其他所有内容保留为DLL主机在加载完成后或在卸载开始之前可以调用的单独函数.在你的情况下,最低限度可能根本没有.
| 归档时间: |
|
| 查看次数: |
1141 次 |
| 最近记录: |