DWScript:TdwsGuardianThread.Finalize在DLL内部冻结

时间:2013-05-30 11:01:37

标签: dwscript

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

任何帮助表示感谢。

1 个答案:

答案 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.