0

私は非常に奇妙な問題を抱えています。誰かが私に説明してくれることを願っています。

VCL アプリと FMX dll (FMX 形式の dll) を作成しました。LoadLibrary と FreeLibrary を使用して動的に DLL をロードする必要があります。2 つのケースがあります。

最初のケースでは、私のコードは次のとおりです。

procedure TForm2.FormCreate(Sender: TObject);
begin
    Path := ExtractFilePath(Application.ExeName)+ 'plugins\';
  FLibHandle := LoadLibrary(PWideChar(Path + 'Plugin.dll'));
  if FLibHandle > 32 then
  begin
    @FOpenForm := GetProcAddress(FLibHandle, 'TestOpenGUI') ;
    @FCloseForm := GetProcAddress(FLibHandle, 'TestCloseGUI') ;  
  end;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  FreeLibrary(FLibHandle);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 FOpenForm;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  FCloseForm;
end;

ここでの問題は、button1 をクリックしてから button2 (dll フォームを開いてから閉じるだけ) をクリックしてアプリを閉じると、FreeLibrary でハングすることです。アプリを終了する必要があります (CTRL+F2)。

2番目のケースでは、私のコードは次のとおりです。

procedure TForm2.Button1Click(Sender: TObject);
begin
 FOpenForm;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  FCloseForm;
end;

initialization
  Path := ExtractFilePath(Application.ExeName)+ 'plugins\';
  FLibHandle := LoadLibrary(PWideChar(Path + 'Plugin.dll'));
  if FLibHandle > 32 then
  begin
     @FOpenForm := GetProcAddress(FLibHandle, 'TestOpenGUI') ;
     @FCloseForm := GetProcAddress(FLibHandle, 'TestCloseGUI') ;  
  end;

finalization
  FreeLibrary(FLibHandle);

ライブラリが読み込まれ、button1、button2 の順にクリックしてアプリを閉じると、問題なくライブラリが解放されます。この場合、すべてがうまく機能します。

私は少し混乱していて、何が間違っているのかわかりません。

ご協力いただきありがとうございます。

4

0 に答える 0