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

时间:2015-07-08 08:50:32

标签: delphi winapi

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

例如,单击jpeg图像文件会将其启动到Windows照片查看器中 出于某种原因,当点击位图图像文件时它没有打开,它没有做任何事情。
只需通过Windows在程序外打开文件,就可以通过windows photo viewer打开它。

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

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

2 个答案:

答案 0 :(得分:2)

首先要说的是你没有检查错误。这是我们每天在这里多次观察到的常见错误。也许您习惯于基于异常的错误处理。但Win32不会抛出异常。必须明确编码错误检查。

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

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

一旦您添加了正确的错误检查,您就可以解决在这种情况下出错的问题。

答案 1 :(得分:0)

如果你像David建议的那样做了错误检查,你就会知道出了什么问题。

检查以下代码:

uses
  WinAPI.ShellApi;

procedure TForm22.Button1Click(Sender: TObject);
var
  Command: string;
  Info: TShellExecuteInfo;
  MyFilename: string;
begin
  MyFilename:= 'C:\Windows\SysWOW64\oobe\Background.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);归零,因为堆栈可以并且确实包含随机垃圾。