无法使用默认程序打开位图文件



我有一个表单,它有一个TImage组件,从一个目录显示图像。单击TImage组件使用其默认程序打开该文件。

例如,单击jpeg图像文件将将其启动到windows照片查看器。由于某些原因,当点击位图图像文件时,它不打开,它不做任何事情。
在程序外通过windows打开文件会通过windows照片查看器打开。

下面是我点击TImage组件时所做的代码。

procedure TfrmCase.ImageClick(Sender: TObject);
begin
  ShellExecute(Handle, 'open',PChar(filen), nil,nil,SW_SHOWNORMAL) ;
end;

首先要说的是,您没有检查错误。这是一个常见的错误,我们在这里每天都会看到很多次。也许您已经习惯了基于异常的错误处理。但是Win32不会抛出异常。错误检查必须显式编码。

在这种情况下,您需要检查函数的返回值。然而,ShellExecute已经过时,被ShellExecuteEx所取代。只有后者能够正确地报告错误。

因此,您必须检查文档中描述的错误。调用ShellExecuteEx并测试返回值。如果为false,则函数失败。如果发生这种情况,调用GetLastError获取扩展信息。

一旦你添加了适当的错误检查,你就可以找出在这种情况下出了什么问题。

如果你按照David的建议做了错误检查,你就会知道哪里出错了。

检查以下代码:

uses
  WinAPI.ShellApi;
procedure TForm22.Button1Click(Sender: TObject);
var
  Command: string;
  Info: TShellExecuteInfo;
  MyFilename: string;
begin
  MyFilename:= 'C:WindowsSysWOW64oobeBackground.bmp';
  FillChar(Info,SizeOf(Info),#0);
  Info.cbSize:= SizeOf(Info);
  Info.fMask:= SEE_MASK_DEFAULT;
  Info.lpFile:= PWideChar(MyFilename);
  Info.nShow:= SW_NORMAL;
  //Info.lpVerb:= 'open';  
  Win32Check(ShellExecuteEx(@Info));
end;

这对于默认动词来说很好。

ShellExecuteEx的信息在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784%28v=vs.85%29.aspx
这里:https://msdn.microsoft.com/en-us/library/windows/desktop/bb762154%28v=vs.85%29.aspx

始终记住将记录FillChar(Info,SizeOf(Info),#0);归零,因为堆栈可以并且确实包含随机垃圾。

最新更新