回到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
,如果没有找到任何东西,buffPath
将被设置为类似C:\WINDOWS\system32\OpenWith.exe
的东西。
现在有没有更好的方法来确定文件扩展名没有Shell关联?
PS.我不想只把文件名和OpenWith.exe
进行比较。如果有一个合法的可执行文件叫做...一定有更好的办法。
1条答案
按热度按时间dxxyhpgq1#
我想我明白了关键是要使用正确的旗帜。这似乎适用于XP和更高版本:
这里还有一个技巧,我花了一些时间才弄明白--不要使用
AssocQueryStringA()
。AssocQueryStringA()
的shim将其传递的字符串参数转换为Unicode,在XP(以及evidently in Vista)中有一个bug,这将使该API在这些操作系统上失败。所以,如果你自己做ANSI到Unicode的转换并调用AssocQueryStringW()
,问题就会消失(显然14年的时间不足以让微软修复这个bug?)).