Windows11下ShellExecute打开.pptx失败,如何调出‘打开方式’对话框?
解决Windows 11下ShellExecute打开无关联文件返回31的问题
当文件没有默认关联时,直接用ShellExecute的open或openas操作在Windows 11中可能返回错误31,无法触发系统的「选择应用」对话框。要实现和双击文件完全一致的效果,应该使用系统原生的SHOpenWithDialog API。
实现步骤
- 先在代码中声明
SHOpenWithDialog函数(需引用ShellAPI和ShlObj单元):
uses ShellAPI, ShlObj; function SHOpenWithDialog(hwnd: HWND; const lpFile: LPCWSTR): HRESULT; stdcall; external 'shell32.dll' name 'SHOpenWithDialogW';
- 调用该API弹出「打开方式」对话框:
var sFilePath: string; begin sFilePath := txtFile.Text; if SHOpenWithDialog(Handle, PWideChar(sFilePath)) <> S_OK then MessageDlg('无法打开选择应用对话框', mtError, [mbOK], 0); end;
为什么之前的方法无效?
Windows 11对文件关联机制做了调整,当文件没有默认关联时,ShellExecute的open或openas操作会因为找不到可执行关联而返回错误31(ERROR_GEN_FAILURE),而系统双击无关联文件时,实际调用的是SHOpenWithDialog来唤起选择应用的对话框,因此直接使用这个API才能完全匹配系统行为。
如果坚持使用ShellExecute,可以尝试调用宽字符版本ShellExecuteW并指定'openas'操作,不过这种方式在部分场景下仍可能失效,不如SHOpenWithDialog可靠:
if ShellExecuteW(Handle, 'openas', PWideChar(txtFile.Text), nil, nil, SW_SHOWNORMAL) <= 32 then MessageDlg('操作失败', mtError, [mbOK], 0);
内容的提问来源于stack exchange,提问作者alancc
相关产品推荐
相关产品推荐

