0
我想顯示給定文件名(基於擴展名)使用AssocQueryKey()
API函數的文件類型。 問題是有時候返回錯誤的HKEY
值。例如,以下函數在win 7 ultimate x64上正常工作,但是在我的win xp x86機器上有一些擴展名(例如「.mp3」)失敗(其他擴展工作正常)。 即使 「成功」,並返回S_OK,GetLastError()
後AssocQueryKey()
調用1008 ALWAYS:從Windows註冊表獲取文件類型在c + +
// 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()
。
當你說「無法像」 .MP3' 一些擴展」,你的意思是,它返回'S_OK'但'HKEY'不正確的註冊表位置?請注意,當沒有錯誤返回時檢查'GetLastError()'的值是沒有意義的 - 最後的錯誤代碼通常是由您調用的API調用的函數偶然設置的。它的值是沒有意義的,除非你得到一個錯誤發生的指示(換句話說,成功的API不需要保持最後一個錯誤的原始值或將其設置爲0)。 – 2010-08-17 17:24:26
第一個參數的NULL沒有意義。此處需要定義失敗。 – 2010-08-17 17:40:56