Получить тип файла из реестра Windows в C ++ - PullRequest
0 голосов
/ 17 августа 2010

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

// 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(), если это имеет значение.

1 Ответ

2 голосов
/ 17 августа 2010

Не следует использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...