簡體   English   中英

在C ++中從Windows注冊表獲取文件類型

[英]Get file type from windows registry in c++

我正在嘗試使用AssocQueryKey() API函數顯示給定文件名的文件類型(基於擴展名)。 問題是有時返回錯誤的HKEY值。 例如,以下功能在win 7 Ultimate x64上可以正常工作,但在win xp x86機器上的某些擴展名(如“ .mp3”)失敗(盡管其他擴展名也可以)。 即使“成功”並返回S_OK,在調用AssocQueryKey()之后, GetLastError()也始終為1008:

// 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()

您不應將GetLastError用於直接返回錯誤代碼的函數。 AssocQueryKey的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM