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