只要文件具有正确的关联,我就可以使用 Windows ShellExecute 函数毫无问题地打开文件。
如果不存在关联,我想使用默认的 windows 对话框打开文件:
这可能吗?如果有怎么办?
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.fMask = SEE_MASK_NOASYNC;
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = "openas";
sei.lpFile = "C:\\yourfile.ext";
ShellExecuteEx(&sei);
如果您在下面检查,HKEY_CLASSES_ROOT\Unknown\shell\openas
您会发现这与在 shell32 中调用(未记录的)OpenAs_RunDLL 导出相同。
执行RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open
干脆不要使用显式动词。使用像“open”这样的特定动词是一个很大的错误:
简单地将 NULL 作为动词传递是一种更正确的方法。系统会自动选择最合适的动词:
换句话说,简单
ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);
将显示“打开方式”对话框。
如果你想要一个特定的动作,只使用一个特定的动词。例如“打印”、“探索”、“运行”。否则 - 只是通过零。