<分区>
我想让用户为当前未注册的文件扩展名选择关联(打开)。
目前我告诉 API 使用 ShellExecute
打开文件,它返回一个 ERROR_NO_ASSOCIATION
错误代码。
有没有办法告诉 API 它应该让用户选择一个新的关联?
<分区>
我想让用户为当前未注册的文件扩展名选择关联(打开)。
目前我告诉 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
来省略 ShellExecute
和 RunDll32
:
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/