如何查找是否可以通过ShellExecute打开文档?

时间:2009-08-12 09:15:11

标签: c++ winapi shellexecute

我想检查特定文件是否可以通过ShellExecute成功“打开”,所以我试图使用AssocQueryString来发现它。

示例:

DWORD size = 1024;
TCHAR buff[1024];  // fixed size as dirty hack for testing

int err = AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".mxf", NULL ,buff , &size);
openAction->Enabled  = ((err == S_OK) || (err == S_FALSE)) && (size > 0);

现在,这个几乎有效。如果有注册的应用程序,我会收到字符串。

但是,有一个问题:在Vista上,即使没有注册的应用程序,它返回应用程序c:\ Windows \ System32 \ shell32.dll是关联的,这是带来100%无用的东西“ Windows无法打开此文件:Use the Web service to find the correct program?“对话。

显然,我想隐藏最终用户的cr * p,但只是简单地将返回的字符串与常量进行比较,这似乎是一种丑陋,暴力和脆弱的方式。

此外,黑客入侵注册表以完全禁用此对话框并不是一个好主意。

什么是更好的选择?

2 个答案:

答案 0 :(得分:6)

我总是使用FindExecutable()来获取给定文档的注册申请。

答案 1 :(得分:4)

使用ASSOCF_INIT_IGNOREUNKNOWN选项标记AssocQueryString(),还有另一种方法可以做到这一点。

int err = AssocQueryString(ASSOCF_INIT_IGNOREUNKNOWN, ASSOCSTR_EXECUTABLE, ".mxf", NULL ,buff , &size);

与使用FindExecutable()

相比,这有几个重要的优势
  • 它只能使用文件扩展名,而FindExecutable需要指向指定类型的现有文件的完整路径。
  • 因为它没有访问该文件,所以使用Samba和其他网络存储要快得多。通过Samba在包含~3000个文件的目录中的一个文件上调用FindExecutable()>我的测试中有1秒钟。