2010-08-17 81 views
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()

+0

當你說「無法像」 .MP3' 一些擴展」,你的意思是,它返回'S_OK'但'HKEY'不正確的註冊表位置?請注意,當沒有錯誤返回時檢查'GetLastError()'的值是沒有意義的 - 最後的錯誤代碼通常是由您調用的API調用的函數偶然設置的。它的值是沒有意義的,除非你得到一個錯誤發生的指示(換句話說,成功的API不需要保持最後一個錯誤的原始值或將其設置爲0)。 – 2010-08-17 17:24:26

+0

第一個參數的NULL沒有意義。此處需要定義失敗。 – 2010-08-17 17:40:56

回答

2

對於直接返回錯誤代碼的函數,您不應該使用GetLastErrorAssocQueryKey的MSDN頁面顯示「如果成功返回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