我想让用户为当前未注册的文件扩展名选择一个关联(打开方式).
目前我告诉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;
Windows Vista和更高版本还有SHOpenWithDialog. (我觉得有趣的是,Microsoft写了一个兼容RunDLL的入口点,但直到Vista并没有提供常规的API函数.)