我有一个表单,其上有一个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;
答案 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);
归零,因为堆栈可以并且确实包含随机垃圾。