windows - 如何为未注册的文件扩展名显示 "open with"对话框?

标签 windows delphi winapi

<分区>

我想让用户为当前未注册的文件扩展名选择关联(打开)。

目前我告诉 API 使用 ShellExecute 打开文件,它返回一个 ERROR_NO_ASSOCIATION 错误代码。

有没有办法告诉 API 它应该让用户选择一个新的关联?

最佳答案

我用

procedure ShellOpenAs(const AFileName: string; AHandle: HWND);
begin
  ShellExecute(AHandle, 'open', PChar('rundll32.exe'), PChar('shell32.dll,OpenAs_RunDLL ' + AFileName), nil, SW_SHOWNORMAL);
end;

编辑(灵感来自大卫的评论和 https://stackoverflow.com/a/13229516/1431618 ): 可以通过直接调用 OpenAs_RunDLL 来省略 ShellExecuteRunDll32:

procedure OpenAs_RunDLL(hwnd: HWND; hinst: HINST; lpszCmdLine: LPSTR; nCmdShow: Integer); stdcall; external shell32;

procedure ShellOpenAs(AHandle: HWND; const AFileName: string);
begin
  OpenAs_RunDLL(AHandle, HInstance, PChar(AFileName), SW_SHOWNORMAL);
end;

还有SHOpenWithDialog在 Windows Vista 及更高版本上。 (我发现有趣的是,Microsoft 编写了一个 RunDLL 兼容入口点,但直到 Vista 才懒得提供常规 API 函数。)

关于windows - 如何为未注册的文件扩展名显示 "open with"对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9224693/

相关文章:

delphi - 为什么升级到 Delphi 2007 之后我的加密不起作用?

java - 指定输入

windows - 是否有生成 SDDL(安全描述符定义语言)字符串的工具?

delphi - 视觉形式继承问题。 "cannot inherit from (parent form). Contains a component that does not support inheritance"

c++ - 使用 Win32 执行命令

c++ - 在 Windows 中从接口(interface)名称获取 IP 地址

c++ - 如何从Visual C++中获取具体的windows服务可执行文件路径

c# - SQLite 不存储/检索数据库

java - 从批处理文件的进程中读取 InputStream 会跳到下一行

错误时释放资源的 goto 链的 OOP 等价物?