[英]Get file type from windows registry in c++
我正在嘗試使用AssocQueryKey()
API函數顯示給定文件名的文件類型(基於擴展名)。 問題是有時返回錯誤的HKEY
值。 例如,以下功能在win 7 Ultimate x64上可以正常工作,但在win xp x86機器上的某些擴展名(如“ .mp3”)失敗(盡管其他擴展名也可以)。 即使“成功”並返回S_OK,在調用AssocQueryKey()
之后, GetLastError()
也始終為1008:
// Return STL string representation of file type from windows registry
stlstring GetFileTypeFromRegistry(const stlstring& m_filename)
{
CRegKey reg;
HKEY key = {0};
stlstring s;
//Get file extension
LPCTSTR fExt = PathFindExtension(m_filename.c_str());
if(AssocQueryKey(NULL, ASSOCKEY_CLASS, fExt, TEXT(""), &key) != S_OK)
DisplayError(_T("AssocQueryKey != S_OK"), GetLastError());
else
DisplayError(_T("AssocQueryKey == S_OK"), GetLastError());
if(reg.Open ( key, NULL, KEY_QUERY_VALUE) != ERROR_SUCCESS){
reg.Close();
DisplayError((LPTSTR)fExt);
return s;
}
//DWORD out = 0;
/*WCHAR *h = new WCHAR[1024];
ZeroMemory(h, sizeof(h));
AssocQueryStringByKey(0, ASSOCSTR_EXECUTABLE, HKEY_CLASSES_ROOT, NULL, h, &out);
//MessageBox(0,_T("gbtbb"),h,MB_OK);
delete[] h;*/
ULONG m_sz = 256;
//if( reg.QueryStringValue(NULL, NULL, &m_sz) == ERROR_SUCCESS){
TCHAR *m_regstring = new TCHAR[m_sz + 1];
if(reg.QueryStringValue(NULL, m_regstring, &m_sz) == ERROR_SUCCESS){
//DisplayError(_T(""));
s += m_regstring;
/*delete[] m_regstring; m_regstring = NULL;
reg.Close();
return s;*/
} else {
DisplayError(_T("CRegKey::QueryStringValue()"), GetLastError());
}
s += m_regstring;
delete[] m_regstring; m_regstring = NULL;
reg.Close();
return s;
/*}
reg.Close();
return s;*/
}
有什么想法嗎?? 該函數來自Windows資源管理器加載的DLL,如果需要的話,可以實現IQueryInfo::GetInfoTip()
。
您不應將GetLastError
用於直接返回錯誤代碼的函數。 AssocQueryKey
的MSDN頁面上AssocQueryKey
“如果成功則返回S_OK,否則返回COM錯誤值。”,這意味着您已經在返回值中獲取了錯誤代碼。
如果只想獲取文件類型信息,則有一個更簡單的解決方案: SHGetFileInfo
。 使用起來非常簡單,就像這樣:
SHFILEINFO shfi;
SHGetFileInfo(filename, 0, &shfi, sizeof(shfi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
// shfi.szTypeName now contains the file type string of the given filename
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.