随笔-60  评论-98  文章-0  trackbacks-0

    // 首先调用GetFileVersionInfoSize获取版本号长度
    String MyName = "C:\\Maxthon.exe";
    DWORD NoUse = 0;  //没有什么用
    DWORD InfoSize = ::GetFileVersionInfoSize(MyName.c_str(), &NoUse);
    // 有效的长度
    if (InfoSize > 0)
    {
        auto_ptr<char> VersionInfo(new char[InfoSize]);
        if(true == ::GetFileVersionInfo(MyName.c_str(),NoUse,InfoSize,VersionInfo.get())) // 获取版本信息成功
        {
            char *pValue = NULL;
            UINT ValueLen;
            String FileInfo = "\\StringFileInfo\\";

            //抄MSDN的代码
            struct LANGANDCODEPAGE {
                WORD wLanguage;
                WORD wCodePage;
            } *lpTranslate;

            //default 0x0804 \StringFileInfo\lang-codepage\string-name
            if (true == ::VerQueryValue(VersionInfo.get(), "\\VarFileInfo\\Translation", (LPVOID *)&lpTranslate, &ValueLen))
            {
                if (ValueLen / sizeof(LANGANDCODEPAGE) >= 1)
                {
                    FileInfo = FileInfo + IntToHex(lpTranslate[0].wLanguage, 4)+  IntToHex(lpTranslate[0].wCodePage,4) + "\\"; // 这一步很关键哦

                    if (true == ::VerQueryValue(VersionInfo.get(), String(FileInfo + "ProductName").c_str(), (LPVOID *)&pValue, &ValueLen)) // 获取ProductName信息,ProductVersion等
                    {
                        String sSoftwareName = String(pValue); // 软件名称
                    }
            }
      }

posted on 2009-02-05 19:24 创建更好的解决方案 阅读(5420) 评论(4)  编辑 收藏 引用 所属分类: C++专栏

评论:
# re: 获取版本信息Version的完整代码(从msdn扩展而来) 2009-02-05 19:42 | 创建更好的解决方案
// 这段代码可以读出多数exe文件的版本信息,无法读取dll版本信息
String GetVersionFromPath(String IDEPath)
{
DWORD dwLen = 0;
char* lpData = NULL;

dwLen = GetFileVersionInfoSize(IDEPath.c_str(), 0);
if (0 == dwLen)
return String("");

lpData =new char [dwLen+1];

if(!GetFileVersionInfo(IDEPath.c_str(), 0, dwLen, lpData))
{
delete lpData;
return String("");
}

LPVOID lpBuffer = NULL;
UINT uLen = 0;

BOOL bSuccess = VerQueryValue(lpData,
TEXT("\\StringFileInfo\\040904b0\\FileVersion"), //0409英文,0804中文
//04b0即1252,ANSI
//可以从ResourceView中的Version中BlockHeader中看到
//可以测试的属性
/*
CompanyName
FileDescription
FileVersion
InternalName
LegalCopyright
OriginalFilename
ProductName
ProductVersion
Comments
LegalTrademarks
PrivateBuild
SpecialBuild
*/
&lpBuffer,
&uLen);
if (!bSuccess)
{
delete lpData;
return String("");
}
String Ret = (char*)lpBuffer;
// Ret.Replace(',', '.');
// Ret.Replace(' ', '0');

delete [] lpData;
return Ret;
}  回复  更多评论
  
# re: 获取版本信息Version的完整代码(从msdn扩展而来)[未登录] 2009-02-05 19:52 | yzzrn
auto_ptr<char> VersionInfo(new char[InfoSize]);
auto_ptr不会释放数组的  回复  更多评论
  
# re: 获取版本信息Version的完整代码(从msdn扩展而来) 2009-02-06 11:05 | Dancefire
楼主,auto_ptr<char> VersionInfo(new char[xx]);的用法绝对是错的。auto_ptr只会delete指针,而不会delete[]指针。因此VersionInfo的指针不会被释放。

针对这个问题C++09引入了一个新的库,scoped_ptr和scoped_array来替代补充auto_ptr。scoped_array就是可以处理数组的。楼主或者下载微软的2008 feature pack,或者使用boost库,就可以使用这种智能指针了。除此以外,标准还引入了引用计数型指针,如shared_ptr和shared_array。来处理超出函数范围的指针释放问题。楼主可google相关资料。  回复  更多评论
  
# re: 获取版本信息Version的完整代码(从msdn扩展而来) 2009-02-07 22:43 | jmchxy
auto_ptr 是不能施放数组, 但是对char数组来说看成是简单的指针并没有问题,所以这个用法虽然不合规范但实际上是不会有内存泄漏的.  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理