2010-08-17 6 views
0

AssocQueryKey() API 함수를 사용하여 지정된 파일 이름의 파일 유형을 표시하려고합니다 (확장자 기준). 가끔 HKEY 값이 잘못 반환됩니다. 예를 들어, 다음 함수는 7 x64의 궁극적 인 x64에서 올바르게 작동하지만 xp x86 시스템에서 승리 한 ".mp3"과 같은 일부 확장에서는 실패합니다 (다른 확장은 작동 함). 이 경우에도 "성공"과 S_OK 반환, GetLastError()AssocQueryKey() 호출 후에 항상 1008입니다이에Windows 레지스트리에서 파일 형식 가져 오기

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

: 그것은 다음과 같이 사용하는 정말 간단합니다 레지스트리 위치? 오류가 반환되지 않을 때 GetLastError()의 값을 검사하는 것은 의미가 없습니다. 마지막 오류 코드는 자주 호출하는 API가 호출하는 함수에 의해 설정되는 경우가 있습니다. 오류가 발생했다는 표시가 나타나지 않으면 (즉, 성공한 API가 마지막 오류의 원래 값을 유지하거나 0으로 설정하지 않아도된다는 의미가 아니라면) 그 값은 의미가 없습니다. –

+0

첫 번째 인수에 대한 NULL은 거의 의미가 없습니다. 여기에는 실패 정의가 필요합니다. –

답변

2

오류 코드를 직접 반환하는 함수에는 GetLastError을 사용하면 안됩니다. AssocQueryKey의 MSDN 페이지는 "성공하면 S_OK를 반환하고, 그렇지 않으면 COM 오류 값을 반환합니다."라는 말은 반환 값에 오류 코드가 이미 있음을 의미합니다.

파일 형식 정보를 얻고 싶다면 훨씬 간단한 해결책이 있습니다 : SHGetFileInfo. 당신이 " '.MP3'와 같은 일부 확장 실패"말할 때, 당신이`S_OK`를 반환하지만`HKEY` 올바른 아닙니다 것을 의미

SHFILEINFO shfi; 
SHGetFileInfo(filename, 0, &shfi, sizeof(shfi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); 
// shfi.szTypeName now contains the file type string of the given filename