4

我想检查一个特定的文件是否可以通过 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无法打开”的东西此文件:使用 Web 服务查找正确的程序?” 对话。

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

此外,破解注册表以完全禁用此对话框也不是一个好主意。

有什么更好的选择?

4

2 回答 2

6

我总是使用FindExecutable()来获取给定文档的注册应用程序。

于 2009-08-12T11:49:48.343 回答
4

还有另一种方法可以做到这一点,将ASSOCF_INIT_IGNOREUNKNOWN选项标志与AssocQueryString().

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

与使用相比,这有几个重要的优点FindExecutable()

  • 它可以仅使用文件扩展名,而FindExecutable需要指定类型的现有文件的完整路径。
  • 因为它不访问文件,所以使用 Samba 和其他网络存储要快得多。在我的测试中,通过 Samba调用FindExecutable()包含约 3000 个文件的目录中的一个文件需要超过 1 秒。
于 2011-07-01T16:36:21.533 回答