在一个小应用程序中,我想在创建主窗体之前显示一个打开的文件对话框。我在* .dpr:
中这样做begin
Application.Initialize;
Init; // <=========================================
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
当我使用以下Init程序时:
procedure Init;
var
OpenDialog: TOpenDialog;
begin
TheFileName := '(nix)';
OpenDialog := TOpenDialog.Create(nil);
try
if OpenDialog.Execute then
TheFileName := OpenDialog.FileName
else
Exit;
finally
OpenDialog.Free;
end;
end;
Windows 7下没有显示对话框。我可以通过将UseLatestCommonDialogs设置为False来解决此问题,但我想避免这种情况。将Init过程更改为
procedure Init;
var
OpenDialog: TOpenDialog;
begin
TheFileName := '(nix)';
CoInitialize(nil);
try
OpenDialog := TOpenDialog.Create(nil);
try
if OpenDialog.Execute then
TheFileName := OpenDialog.FileName
else
Exit;
finally
OpenDialog.Free;
end;
finally
CoUninitialize;
end;
end;
的工作原理。但是我不确定我是否正确使用CoInitialize / CoUninitialize,例如:
修改:我找到了一个更好的方法:如果我将ComObj
添加到dpr的uses
子句中,我可以省略CoInitialize
/ {{1}调用。当然,漏洞抽象问题仍然存在。
答案 0 :(得分:3)
似乎问题是COM没有被初始化。这通常发生在Application.Initialize
中,因为使用ComObj
添加了初始化过程。但是,您在InitProc
内nil
Application.Initialize
的评论中报告,表明您的项目中未包含ComObj
。
因此,您可以通过在项目中包含ComObj
来轻松解决问题。或者如果您想明确它,只需在.dpr文件的最开头调用CoInitilize(nil)
。