1

dwsExprs が DLL に追加されると、そのファイナライズ セクションがフリーズします。実は TdwsGuardianThread.Finalize は、guardian.WaitFor 行でフリーズしています。

この問題を実証するために、空で dwsCript のみを含むサンプル DLL を作成しました。また、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 としての解決策は、上記のコメントで説明した回避策です。

TdwsGuardianThread.Finalize を呼び出すエクスポート関数を DLL に追加し、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 に答える