我想检查特定文件是否可以通过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,但只是简单地将返回的字符串与常量进行比较,这似乎是一种丑陋,暴力和脆弱的方式。
此外,黑客入侵注册表以完全禁用此对话框并不是一个好主意。
什么是更好的选择?
答案 0 :(得分:6)
我总是使用FindExecutable()
来获取给定文档的注册申请。
答案 1 :(得分:4)
使用ASSOCF_INIT_IGNOREUNKNOWN
选项标记AssocQueryString()
,还有另一种方法可以做到这一点。
int err = AssocQueryString(ASSOCF_INIT_IGNOREUNKNOWN, ASSOCSTR_EXECUTABLE, ".mxf", NULL ,buff , &size);
与使用FindExecutable()
FindExecutable
需要指向指定类型的现有文件的完整路径。FindExecutable()
>我的测试中有1秒钟。