0

我有一个非常奇怪的问题,我希望有人可以向我解释。

我创建了 VCL 应用程序和 FMX dll(只是一个 FMX 形式的 dll)。我需要使用 LoadLibrary 和 FreeLibrary 动态加载 DLL。有两种情况。

在第一种情况下,我的代码是:

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

在第二种情况下,我的代码是:

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