2

只要文件具有正确的关联,我就可以使用 Windows ShellExecute 函数毫无问题地打开文件。

如果不存在关联,我想使用默认的 windows 对话框打开文件:

图片

这可能吗?如果有怎么办?

4

3 回答 3

6

显示该对话框的记录 方法是使用 openas 动词。

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 导出相同。

于 2011-06-17T16:14:35.470 回答
1

执行RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open

于 2011-06-16T14:49:39.270 回答
0

干脆不要使用显式动词。使用像“open”这样的特定动词是一个很大的错误:

  • “open”可能不是默认动词(例如,它可能是“play”、“edit”或“run”)
  • “开放”可能不存在

简单地将 NULL 作为动词传递是一种更正确的方法。系统会自动选择最合适的动词:

  • 如果已设置,将使用默认动词
  • 如果未设置默认动词,将使用“开放”动词
  • 如果没有默认和“开放”动词可用,将使用第一个动词
  • 如果没有分配动词 - 系统将显示“打开方式”对话框

换句话说,简单

ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);

将显示“打开方式”对话框。

如果你想要一个特定的动作,只使用一个特定的动词。例如“打印”、“探索”、“运行”。否则 - 只是通过零。

于 2015-03-11T22:05:49.330 回答