GetFileVersionString

//     pName    _T("CompanyName"),_T("FileDescription"),_T("FileVersion"),
//     _T("InternalName"),_T("LegalCopyright"),_T("OriginalFilename"),
//     _T("ProductName"),_T("ProductVersion"),
BOOL GetFileVersionString(CHAR  *  pFileName, _bstr_t  *  pRecvStr, TCHAR  *  pName  /* = NULL */ )
{
    DWORD    dwDummyHandle; 
// will always be set to zero
    DWORD    dwLen;
    BYTE    
* pVersionInfo;
    BOOL    bRetVal;

    VS_FIXEDFILEINFO    FileVersion;
    
*pRecvStr = "Error";

    
struct TRANSLATION {
        WORD langID;            
// language ID
        WORD charset;            // character set (code page)
    }
 Translation;

    HMODULE        hVerDll;
    hVerDll 
= LoadLibrary(_T("VERSION.dll"));
    
if(hVerDll == NULL)
        
return FALSE;

    typedef DWORD (WINAPI 
*Fun_GetFileVersionInfoSizeA)(CHAR *, DWORD *);
    typedef BOOL  (WINAPI 
*Fun_GetFileVersionInfoA)(CHAR *, DWORD, DWORD, LPVOID);
    typedef BOOL  (WINAPI 
*Fun_VerQueryValueA)(LPVOID, CHAR *, LPVOID, PUINT);


    Fun_GetFileVersionInfoSizeA        pGetFileVersionInfoSizeA;
    Fun_GetFileVersionInfoA            pGetFileVersionInfoA;
    Fun_VerQueryValueA                pVerQueryValueA;

    pGetFileVersionInfoSizeA 
= (Fun_GetFileVersionInfoSizeA)::GetProcAddress(hVerDll, "GetFileVersionInfoSizeA");
    pGetFileVersionInfoA     
= (Fun_GetFileVersionInfoA)::GetProcAddress(hVerDll, "GetFileVersionInfoA");
    pVerQueryValueA             
= (Fun_VerQueryValueA)::GetProcAddress(hVerDll, "VerQueryValueA");

    Translation.charset 
= 1252;        // default = ANSI code page

    dwLen 
= pGetFileVersionInfoSizeA(pFileName, &dwDummyHandle);
    
if (dwLen == 0)
        
return FALSE;

    pVersionInfo 
= new BYTE[dwLen]; // allocate version info
    bRetVal = pGetFileVersionInfoA(pFileName, 0, dwLen, pVersionInfo);
    
if(bRetVal == FALSE)
    
{
        delete [] pVersionInfo;
        
return FALSE;
    }


    VOID    
* pVI;
    UINT    uLen;

    bRetVal 
= pVerQueryValueA(pVersionInfo, "/"&pVI, &uLen);
    
if(bRetVal == FALSE)
    
{
        delete [] pVersionInfo;
        
return FALSE;
    }


    memcpy(
&FileVersion, pVI, sizeof(VS_FIXEDFILEINFO));

    bRetVal 
= pVerQueryValueA(pVersionInfo, "/VarFileInfo/Translation"
        
&pVI, &uLen);
    
if(bRetVal && uLen >= 4)
    
{
        memcpy(
&Translation, pVI, sizeof(TRANSLATION));
    }


    BREAKIF(FileVersion.dwSignature 
!= VS_FFI_SIGNATURE);

    CHAR        szQuery[
1024];
    CHAR        
* pVal;
    UINT        iLenVal;

    
if(pName == NULL)
    
{
        sprintf(szQuery, 
"%d.%d.%d.%d",
            HIWORD(FileVersion.dwFileVersionMS), LOWORD(FileVersion.dwFileVersionMS),
            HIWORD(FileVersion.dwFileVersionLS), LOWORD(FileVersion.dwFileVersionLS));
        
*pRecvStr = szQuery;
    }

    
else
    
{
        _bstr_t        bStrName 
= pName;
        sprintf(szQuery, 
"/StringFileInfo/%04x%04x/%s",
            Translation.langID, Translation.charset, (CHAR 
*)bStrName);

        bRetVal 
= pVerQueryValueA(pVersionInfo, szQuery, (LPVOID*)&pVal, &iLenVal);
        
*pRecvStr = pVal;
    }


    delete [] pVersionInfo;
    
return TRUE;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值