怎样读到资源文件中的版本信息?希望可以告知函数或直接代码。
谢谢。

解决方案 »

  1.   


    #pragma comment (lib, "version.lib")BOOL CStockXPApp::ReadResourceInformation()
    {
    DWORD dwLength, dwSize, dwNullHandle;
    TCHAR szFileName [MAX_PATH];
    LPVOID lpVersionPtr;
    UINT uiVerLength;


    dwSize = sizeof (szFileName) / sizeof (szFileName [0]);
    dwLength = ::GetModuleFileName (AfxGetInstanceHandle(), szFileName, dwSize);
    if (dwLength <= 0) 
    return FALSE; m_VersionInfo.sFilePath=szFileName;
    dwLength = ::GetFileVersionInfoSize (szFileName, &dwNullHandle);
    if (dwLength <= 0) 
    return FALSE; BYTE* pVersionInfo = new BYTE [dwLength];
    if (!::GetFileVersionInfo (szFileName, NULL, dwLength, pVersionInfo)) 
    return FALSE;
    if (!::VerQueryValue (pVersionInfo, _T ("\\"), &lpVersionPtr, &uiVerLength)) 
    return FALSE; m_VersionInfo.vsFixedFileInfo = *(VS_FIXEDFILEINFO*)lpVersionPtr;

    if (!GetDynamicInfo(pVersionInfo)) 
    return FALSE;
    if (!GetFixedFileInfo ()) 
    return FALSE;

    delete pVersionInfo; return TRUE;
    }BOOL CStockXPApp::GetFixedFileInfo()
    {
    m_VersionInfo.stMajorVersion.Format("%d",HIWORD (m_VersionInfo.vsFixedFileInfo.dwFileVersionMS));
    m_VersionInfo.stMinorVersion.Format("%d",LOWORD (m_VersionInfo.vsFixedFileInfo.dwFileVersionMS));
    m_VersionInfo.stDllVersion.Format ("%d.%d.%d.%d", 
    HIWORD (m_VersionInfo.vsFixedFileInfo.dwFileVersionMS), LOWORD (m_VersionInfo.vsFixedFileInfo.dwFileVersionMS),
    HIWORD (m_VersionInfo.vsFixedFileInfo.dwFileVersionLS), LOWORD (m_VersionInfo.vsFixedFileInfo.dwFileVersionLS)); if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_DRV)
    {
    switch (m_VersionInfo.vsFixedFileInfo.dwFileSubtype) 
    {
    case VFT2_DRV_DISPLAY:
    m_VersionInfo.stFileType = _T ("Display driver");
    break;
    case VFT2_DRV_INSTALLABLE:
    m_VersionInfo.stFileType = _T ("Installable driver");
    break;
    case VFT2_DRV_KEYBOARD:
    m_VersionInfo.stFileType = _T ("Keyboard driver");
    break;
    case VFT2_DRV_LANGUAGE:
    m_VersionInfo.stFileType = _T ("Language driver");
    break;
    case VFT2_DRV_MOUSE:
    m_VersionInfo.stFileType = _T ("Mouse driver");
    break;
    case VFT2_DRV_NETWORK:
    m_VersionInfo.stFileType = _T ("Network driver");
    break;
    case VFT2_DRV_PRINTER:
    m_VersionInfo.stFileType = _T ("Printer driver");
    break;
    case VFT2_DRV_SOUND:
    m_VersionInfo.stFileType = _T ("Sound driver");
    break;
    case VFT2_DRV_SYSTEM:
    m_VersionInfo.stFileType = _T ("System driver");
    break;
    case VFT2_UNKNOWN:
    m_VersionInfo.stFileType = _T ("Unknown driver");
    break;
    }
    }
    else if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_FONT) 
    {
    switch (m_VersionInfo.vsFixedFileInfo.dwFileSubtype) 
    {
    case VFT2_FONT_RASTER:
    m_VersionInfo.stFileType = _T ("Raster font");
    break;
    case VFT2_FONT_TRUETYPE:
    m_VersionInfo.stFileType = _T ("Truetype font");
    break;
    case VFT2_FONT_VECTOR:
    m_VersionInfo.stFileType = _T ("Vector font");
    break;
    case VFT2_UNKNOWN:
    m_VersionInfo.stFileType = _T ("Unknown font");
    break;
    }
    }
    else if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_APP) 
    {
    m_VersionInfo.stFileType = _T ("Application");
    }
    else if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_DLL) 
    {
    m_VersionInfo.stFileType = _T ("Dynamic link library");
    }
    else if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_STATIC_LIB) 
    {
    m_VersionInfo.stFileType = _T ("Static link library");
    }
    else if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_VXD) 
    {
    m_VersionInfo.stFileType = _T ("Virtual device");
    }
    else if (m_VersionInfo.vsFixedFileInfo.dwFileType == VFT_UNKNOWN) 
    {
    m_VersionInfo.stFileType = _T ("Unknown type");
    } switch (m_VersionInfo.vsFixedFileInfo.dwFileOS) 
    {
    case VOS_DOS:
    m_VersionInfo.stFileOS = _T ("MS-DOS");
    break;
    case VOS_DOS_WINDOWS16:
    m_VersionInfo.stFileOS = _T ("16-bit windows running on MS-DOS");
    break;
    case VOS_DOS_WINDOWS32:
    m_VersionInfo.stFileOS = _T ("Win32 API running on MS-DOS");
    break;
    case VOS_OS216:
    m_VersionInfo.stFileOS = _T ("16-bit OS/2");
    break;
    case VOS_OS216_PM16:
    m_VersionInfo.stFileOS = _T ("16-bit Presentation manager running on 16-bit OS/2");
    break;
    case VOS_OS232:
    m_VersionInfo.stFileOS = _T ("32-bit OS/2");
    break;
    case VOS_NT:
    m_VersionInfo.stFileOS = _T ("Windows NT");
    break;
    case VOS_NT_WINDOWS32:
    m_VersionInfo.stFileOS = _T ("Win32 API on Windows NT");
    break;
    case VOS_UNKNOWN:
    m_VersionInfo.stFileOS = _T ("Unknown OS");
    break;
    } return (true);
    }BOOL CStockXPApp::GetDynamicInfo(BYTE *pVersionInfo)
    {
    UINT uiVerLength;
    LPVOID lpPtr;
    CString sQuery;

    if (::VerQueryValue (pVersionInfo, "\\VarFileInfo\\Translation", &lpPtr, &uiVerLength))
    m_VersionInfo.Translation = *(VERSION_INFORMATION::TRANSLATE*)lpPtr;

    sQuery.Format ( _T ("\\StringFileInfo\\%04x%04x\\CompanyName"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stCompany=CString((LPCTSTR)lpPtr);

    sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\LegalCopyRight"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stCopyRight=CString((LPCTSTR)lpPtr); sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\ProductName"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stProductName=CString((LPCTSTR)lpPtr); sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\ProductVersion"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stProductVersion=CString((LPCTSTR)lpPtr); sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\OriginalFileName"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stOriginalName=CString((LPCTSTR)lpPtr); sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\FileDescription"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stDescription=CString((LPCTSTR)lpPtr);

    sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\FileVersion"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stFileVersion=CString((LPCTSTR)lpPtr); sQuery.Format (_T ("\\StringFileInfo\\%04x%04x\\InternalName"),m_VersionInfo.Translation.languageId, m_VersionInfo.Translation.characterSet);
    ::VerQueryValue (pVersionInfo, (LPTSTR)(LPCTSTR)sQuery, (LPVOID*)&lpPtr,&uiVerLength);
    m_VersionInfo.stInternalName=CString((LPCTSTR)lpPtr);
    return TRUE;
    }BOOL CStockXPApp::ReadFileTime()
    { CFile file;
    if(file.Open(m_VersionInfo.sFilePath,CFile::shareDenyNone,NULL))
    {
    BOOL bRet=GetFileTime((HANDLE)file.m_hFile,&m_CreationTime,&m_LastAccessTime,&m_LastWriteTime);
    file.Close();
    return bRet;
    }
    return FALSE;
    }