2010-08-17 2 views
0

Я пытаюсь отобразить тип файла данного имени файла (на основе расширения) с помощью функции API AssocQueryKey(). Проблема заключается в неправильном возврате значения HKEY. Например, следующая функция работает правильно на win 7 ultimate x64, но не работает для некоторых расширений типа «.mp3» на моей машине xp x86 win (другие расширения работают, хотя). Даже когда «удалось» и возвращает S_OK, GetLastError() является 1008 ВСЕГДА после AssocQueryKey() вызова:Получить тип файла из реестра 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;*/ 
} 

Любые идеи по этому поводу ?? Эта функция - из библиотеки DLL, загружаемой проводником Windows, при условии, что это имеет значение IQueryInfo::GetInfoTip().

+0

Когда вы говорите, что «не выполняется для некоторых расширений, как» .mp3' », вы имеете в виду, что она возвращает' S_OK' но 'HKEY' не для правильного местоположение реестра? Обратите внимание, что проверка значения 'GetLastError()', когда никакая ошибка не возвращается, бессмысленна - последний код ошибки часто задается случайно функциями, называемыми вызываемым вами API. Его значение бессмысленно, если вы не получите указание на то, что произошла ошибка (другими словами, успешные API не обязаны поддерживать исходное значение последней ошибки или устанавливать ее в 0). –

+0

NULL для 1-го аргумента мало смысла. Здесь требуется определение отказа. –

ответ

2

Вы не должны использовать GetLastError для функций, которые возвращают код ошибки напрямую. На странице 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 
Смежные вопросы