当dwsExprs被添加到DLL中时,它的结束部分冻结。Actaully TdwsGuardianThread。wait .
为了演示这个问题,我制作了一个示例DLL,它是空的,只包含dwsCript。我还做了一个测试应用程序加载DLL并立即释放它。在退出应用程序冻结时,正如我上面所说的(在监护人上设置一个断点)。等等看
样本DLL:
library DlltestDll;
uses
dwsExprs;
{$R *.res}
begin
end.
示例应用程序:
program DllTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows;
var
HDll : HMODULE;
begin
HDll := LoadLibrary('DllTestDll.dll');
FreeLibrary(HDll);
end.
我使用的XE4和DWScript是从5月26日从SVN存储库中提取的。
感谢您的帮助。
DWScript目前的解决方案是我在上面的评论中描述的解决方案:
在DLL中添加一个调用TdwsGuardianThread的导出函数。在卸载DLL之前,在主应用程序中完成并调用导出的函数。之后,当dwsExprs结束部分被调用时,守护线程已经停止,不再冻结任何东西
样例DLL现在看起来如下:
library DlltestDll;
uses
dwsExprs;
{$R *.res}
procedure Finalize; stdcall;
begin
TdwsGuardianThread.Finalize;
end;
exports
Finalize;
begin
end.
示例应用程序是:
program DllTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Windows;
var
HDll : HMODULE;
Finalize : procedure; stdcall;
begin
HDll := LoadLibrary('DllTestDll.dll');
@Finalize := GetProcAddress(HDll, 'Finalize');
Finalize;
FreeLibrary(HDll);
end.