我有一个非常奇怪的问题,我希望有人可以向我解释。
我创建了 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 并关闭应用程序,库将被释放而没有任何问题。在这种情况下,一切正常。
我有点困惑,我不知道我做错了什么。
谢谢你的帮助。