我正在尝试在 Delphi XE2 中创建一个 DLL,它将弹出一个包含 TWebBrowser 组件的表单。当调用 WebBrowser.Navigate2 方法时,单元(或任何单元)的终结部分在应用程序结束时不会被调用。如果未调用 Navigate2,则完成部分会正常进行。
dll 正在从 C++(目前是 VS 2010 MFC 控制台)调用,并通过导入库链接。
还有其他方法可以做到这一点,但我想重用我们已经编写的代码。
有谁知道发生了什么?
谢谢。
这是问题的简单再现:
library DisplayPatientAlertsIntf;
exports DisplayPatientAlertsA name 'DisplayPatientAlertsA@4';
begin
end.
unit uAlertWindow;
interface
uses
Winapi.ActiveX,
Forms,
SHDocVw,
Graphics, Controls;
function DisplayPatientAlertsA(PatientID : PAnsiChar): Integer; export; stdcall;
implementation
var ts : TStringList;
function DisplayPatientAlertsA(PatientID : PAnsiChar): Integer; export; stdcall;
var Form1 : TForm;
WebBrowser1 : TWebBrowser;
DidCoInit : Boolean;
begin
DidCoInit := Succeeded(CoInitialize(nil));
try
Form1 := TForm.Create(nil);
try
WebBrowser1 := TWebBrowser.Create(nil);
try
WebBrowser1.ParentWindow := Form1.Handle;
WebBrowser1.Align := alClient;
WebBrowser1.Navigate2('file://c:\temp.html');
Form1.ShowModal;
finally
WebBrowser1.Free;
end;
finally
Form1.Free;
end;
finally
if DidCoInit then
CoUninitialize;
end;
Result := 0;
end;
initialization
ts := TStringList.Create;
finalization
ts.Free;
end.
更新 2013.03.19 在解决另一个问题(dll 中的 dbExpress 驱动程序)时,我将其从带有导入库的静态链接 dll 更改为动态加载的 dll,一切都开始工作了。