私は非常に奇妙な問題を抱えています。誰かが私に説明してくれることを願っています。
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 の順にクリックしてアプリを閉じると、問題なくライブラリが解放されます。この場合、すべてがうまく機能します。
私は少し混乱していて、何が間違っているのかわかりません。
ご協力いただきありがとうございます。