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