当dwsExprs添加到DLL时,他的终结部分会冻结。 Actaully TdwsGuardianThread.Finalize被冻结在线路监护人身上。等待。
为了演示这个问题,我制作了一个示例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.
我正在使用从SVN存储库中提取的XE4和DWScript。
任何帮助表示感谢。
答案 0 :(得分:2)
DWScript的解决方案目前是我在上述评论中描述的解决方法:
在DLL中添加导出的函数,该函数调用TdwsGuardianThread.Finalize并在卸载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.