我想检查一个特定的文件是否可以通过 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 的部分,但简单地将返回的字符串与常量进行比较似乎是一种丑陋、暴力和脆弱的做法。
此外,破解注册表以完全禁用此对话框也不是一个好主意。
有什么更好的选择?