Chinaunix首页 | 论坛 | 博客
  • 博客访问: 950786
  • 博文数量: 108
  • 博客积分: 3243
  • 博客等级: 中校
  • 技术积分: 964
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-15 22:09
文章分类

全部博文(108)

文章存档

2020年(2)

2019年(1)

2018年(2)

2017年(9)

2016年(20)

2015年(1)

2013年(1)

2012年(12)

2011年(28)

2010年(27)

2009年(4)

2008年(1)

分类: C/C++

2011-10-20 11:24:27

1 windows中获取执行文件exe的版本号
 

QString GetFileVertion(QString aFullName)

{

         QString vRetVersion;

 

         string vFullName = QStringToString(aFullName);

         char vVersion[256] = {0};

 

         DWORD vHandle = 0;

         DWORD vInfoSize = 0;

         vInfoSize = ::GetFileVersionInfoSize(vFullName.c_str(), &vHandle);

         if(vInfoSize <= 0)

         {      

                   return false;

         }

 

         char *pData = new char[vInfoSize + 1];

         memset(pData, 0, vInfoSize + 1);

         if(!::GetFileVersionInfo(vFullName.c_str(), NULL, vInfoSize, pData))   

         {  

                   if(pData)

                   {

                            delete pData;

                   }

                   return   FALSE;  

         }  

 

         string vTempStr = "\\";

         VS_FIXEDFILEINFO *pFileInfo;  

         unsigned int vUInfoSize = 0; 

         if(!::VerQueryValue(pData, vTempStr.c_str(), (void**)&pFileInfo, &vUInfoSize))

         {

                   if(pData)

                   {

                            delete pData;

                   }

                   return false;

         }

 

         WORD vVer[4];  

         vVer[0] = HIWORD(pFileInfo->dwProductVersionMS);    

         vVer[1] = LOWORD(pFileInfo->dwProductVersionMS);  

         vVer[2] = HIWORD(pFileInfo->dwProductVersionLS);  

         vVer[3] = LOWORD(pFileInfo->dwProductVersionLS);   

         sprintf(vVersion, "%d.%d.%d.%d", vVer[0], vVer[1], vVer[2], vVer[3]);

 

         if(pData)

         {

                   delete pData;

         }

         string vVerStr = vVersion;

         vRetVersion = StringToQString(vVerStr);

 

         return vRetVersion;

}
 
2 Mac Os中获取执行文件app的版本号
 
Mac Os 获取执行文件app的版本号需要从Info.plist文件中获取,
Info.plist文件为XML格式 类似如下:
 




 CFBundleExecutable
 VxActuator
 CFBundleGetInfoString
 Created by Qt/QMake
 CFBundleIconFile
 
 CFBundleIdentifier
 com.yourcompany.VxActuator
 CFBundlePackageType
 APPL
 CFBundleSignature
 ????
 CFBundleVersion
 V0.8.0.001
 NOTE
 This file was generated by Qt/QMake.


其中以下为文件版本信息
 CFBundleVersion
 V0.8.0.001
注意: 如无以上信息,请在工程里设置 Version 项
 

QString GetFileVertion(QString aFullName)

{

         QString vRetVersion;

 

         QString vFullName = aFullName + "/Contents/Info.plist";

         if (!VxIsFileExist(vFullName))

         {

                   return "";

         }

        

         QFile vXmlFile(vFullName);

         if (!vXmlFile.open(QIODevice::ReadOnly))

         {

                   vXmlFile.close();

                   return "";

         }

                  

         QTextStream vReadStream(&vXmlFile);

         QTextCodec *vCodec = QTextCodec::codecForName("UTF-8");

         vReadStream.setCodec(vCodec);

         QString vXmlDataStr = vReadStream.readAll();

         vXmlFile.close();

 

         QDomDocument vXmlDoc;

         if (!vXmlDoc.setContent(vXmlDataStr))

         {

                   return "";

         }

         QDomElement vXmlRoot = vXmlDoc.documentElement();

         if (QString::compare(vXmlRoot.tagName(), "plist", Qt::CaseInsensitive) != 0)

         {

                   return "";

         }

        

         QDomNode vDictNode = vXmlRoot.namedItem("dict");

         if (vDictNode.isNull())

         {

                   return "";

         }

         QDomElement vDictElement = vDictNode.toElement();

 

         QDomNode vChildNode = vDictElement.firstChild();

         while(!vChildNode.isNull())

         {

                   QDomElement vChildElement = vChildNode.toElement();

                   if(QString::compare(vChildElement.tagName(), "key", Qt::CaseInsensitive) == 0)

                   {

                            if(QString::compare(vChildElement.text(), "CFBundleVersion", Qt::CaseInsensitive) == 0)

                            {

                                     vChildNode = vChildNode.nextSibling();

                                     vRetVersion = vChildNode.toElement().text();

                                     break;

                            }

                   }

                   vChildNode = vChildNode.nextSibling();

         }

 

         return vRetVersion;

}

 
阅读(6422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~