1

当 dwsExprs 添加到 DLL 时,他的终结部分会冻结。Actaully TdwsGuardianThread.Finalize 被冻结在 Guardian.WaitFor 线上。

为了演示这个问题,我制作了一个示例 DLL,它是空的,只包含 dwsCript。我还制作了一个测试应用程序,加载 DLL 并立即释放它。如上所述,在退出应用程序时冻结(在 Guardian.WaitFor 上放置一个断点以查看它。

示例 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.

我正在使用 5 月 26 日从 SVN 存储库中提取的 XE4 和 DWScript。

任何帮助表示赞赏。

4

1 回答 1

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.
于 2013-05-30T13:38:45.143 回答