在创建主窗体之前使Vista +文件对话框工作

时间:2013-05-22 07:56:21

标签: delphi com delphi-2007 fileopendialog

在一个小应用程序中,我想在创建主窗体之前显示一个打开的文件对话框。我在* .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,例如:

  • 我这么早就打电话给CoUninitialize会搞砸什么吗?
  • 必须“知道”TOpenDialog内部(有时)使用COM的事实,就像我想要避免的泄漏抽象一样。

修改:我找到了一个更好的方法:如果我将ComObj添加到dpr的uses子句中,我可以省略CoInitialize / {{1}调用。当然,漏洞抽象问题仍然存在。

1 个答案:

答案 0 :(得分:3)

似乎问题是COM没有被初始化。这通常发生在Application.Initialize中,因为使用ComObj添加了初始化过程。但是,您在InitProcnil Application.Initialize的评论中报告,表明您的项目中未包含ComObj

因此,您可以通过在项目中包含ComObj来轻松解决问题。或者如果您想明确它,只需在.dpr文件的最开头调用CoInitilize(nil)