sam_yu 发表于 2015-12-31 09:56:04

Qt在windows与Mac OS中获取执行程序版本号

1 windows中获取执行文件exe的版本号
QString GetFileVertion(QString aFullName)
{
         QString vRetVersion;

         string vFullName = QStringToString(aFullName);
         char vVersion = {0};

         DWORD vHandle = 0;
         DWORD vInfoSize = 0;
         vInfoSize = ::GetFileVersionInfoSize(vFullName.c_str(), &vHandle);
         if(vInfoSize <= 0)
         {      
                   return false;
         }

         char *pData = new char;
         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;
         vVer = HIWORD(pFileInfo->dwProductVersionMS);   
         vVer = LOWORD(pFileInfo->dwProductVersionMS);
         vVer = HIWORD(pFileInfo->dwProductVersionLS);
         vVer = LOWORD(pFileInfo->dwProductVersionLS);   
         sprintf(vVersion, "%d.%d.%d.%d", vVer, vVer, vVer, vVer);

         if(pData)
         {
                   delete pData;
         }
         string vVerStr = vVersion;
         vRetVersion = StringToQString(vVerStr);

         return vRetVersion;

}

2 Mac Os中获取执行文件app的版本号

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


http://www.apple.com/DTDs/PropertyList-1.0.dtd">

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;
}
http://blog.iyunv.com/uid-20718335-id-2975923.html
页: [1]
查看完整版本: Qt在windows与Mac OS中获取执行程序版本号