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

时间:2023-03-09 21:55:12
Qt在windows与Mac OS中获取执行程序版本号
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格式 类似如下:
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.chinaunix.net/uid-20718335-id-2975923.html