如何判断操作系统在Windows XP之后是否没有默认文件扩展名关联?

回到Windows XP的日子,可以使用下面的代码来判断扩展是否存在文件关联:

TCHAR buffPath[MAX_PATH] = {0}; DWORD dwszBuffPath = MAX_PATH; HRESULT hR = ::AssocQueryString( ASSOCF_NOFIXUPS | ASSOCF_VERIFY, ASSOCSTR_EXECUTABLE, _T(".weirdassextension"), NULL, buffPath, &dwszBuffPath); if(hR != S_OK && hR != E_POINTER) { //Association does not exist } 

但是从Windows 8开始, AssocQueryString API会返回S_OK并且如果没有find任何东西, buffPath设置为类似于C:\WINDOWS\system32\OpenWith.exe东西。

现在有更好的方法来确定文件扩展名没有壳牌协会?

PS。 我不想只比较文件名到OpenWith.exe 。 如果有一个合法的可执行文件被称为…那么一定有更好的办法。

Solutions Collecting From Web of "如何判断操作系统在Windows XP之后是否没有默认文件扩展名关联?"

我想我明白了。 诀窍是使用正确的标志。 这似乎从XP和以上工作:

 WCHAR wbuffPath[MAX_PATH] = {0}; DWORD dwszBuffPath = MAX_PATH; HRESULT hR = ::AssocQueryStringW(ASSOCF_INIT_IGNOREUNKNOWN, ASSOCSTR_EXECUTABLE, L".weirdassextension", NULL, wbuffPath, &dwszBuffPath); if(hR == 0x80070483) // HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) { //The association is missing } 

还有一个窍门,那就花了我一些时间来解决 – 不要使用AssocQueryStringA()AssocQueryStringA()将其传递的字符串参数转换为Unicode的填充AssocQueryStringA()在XP中有明显的错误( 在Vista中也是如此),这会使这些API在这些操作系统上失败。 所以,如果你自己进行ANSI到Unicode的转换,并且调用AssocQueryStringW() ,问题就会消失(显然14年没有足够的时间让微软修复这个bug了)。