DWScript: TdwsGuardianThread.在DLL内完成冻结



当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.

最新更新