Qt软件开发文档16---软件更新:写入程序版本信息并读取程序的版本号

实现软件更新,需要写入本地软件的版本号,并读取出来,与服务器版本号相比较,决定是否进行软件的更新。

1.写入版本信息:

写入一个rc文件,并将其导入到Qt工程中。 
在Qt工程中,利用RC_FILE+=version.rc 导入工程 
QT+VS编译时,利用cmake导入工程即可. 
代码如下:

 
  1. IDI_ICON1 ICON DISCARDABLE "LYL/icons/tubiao.ico"

  2.  
  3. #if defined(UNDER_CE)

  4. #include

  5. #else

  6. #include

  7. #endif

  8.  
  9. VS_VERSION_INFO VERSIONINFO

  10. FILEVERSION 1.0.0.0

  11. PRODUCTVERSION 1.0.0.0

  12. FILEFLAGSMASK 0x3fL

  13. #ifdef _DEBUG

  14. FILEFLAGS VS_FF_DEBUG

  15. #else

  16. FILEFLAGS 0x0L

  17. #endif

  18. FILEOS VOS__WINDOWS32

  19. FILETYPE VFT_DLL

  20. FILESUBTYPE 0x0L

  21. BEGIN

  22. BLOCK "StringFileInfo"

  23. BEGIN

  24. BLOCK "080404b0"

  25. BEGIN

  26. VALUE "CompanyName", "...公司\0"

  27. VALUE "FileDescription", "...\0"

  28. VALUE "FileVersion", "1.0.0.0\0"

  29. VALUE "ProductVersion", "1.0.0.0\0"

  30. VALUE "LegalCopyright", "版权所有 (C)...公司\0"

  31. VALUE "LegalTrademarks", "...公司\0"

  32. VALUE "OriginalFilename", "Version.exe\0"

  33. VALUE "ProductName", "...查看系统\0"

  34. VALUE "InternalName", "Version.exe\0"

  35. END

  36. END

  37. BLOCK "VarFileInfo"

  38. BEGIN

  39. VALUE "Translation", 0x804, 1200

  40. END

  41. END

效果如下: 
这里写图片描述

2.读取软件的版本号:

首先需要引入三个库

 
  1. #include

  2. #include

  3. #pragma comment(lib, "Version")

写入读取版本号的方法:

 
  1. QString GetFileVertion(QString fullName)

  2. {

  3. QString result = "";

  4. char *pData = nullptr;

  5. DWORD dwlen = GetFileVersionInfoSize(fullName.toStdString().c_str(), 0);

  6. if (0 == dwlen) {

  7. return result;

  8. }

  9. pData = new char[dwlen + 1];

  10. BOOL bSuccess = GetFileVersionInfo(fullName.toStdString().c_str(), 0, dwlen, pData);

  11. if (false == bSuccess) {

  12. delete pData;

  13. return result;

  14. }

  15. LPVOID lpBuffer = nullptr;

  16. UINT uLen = 0;

  17. //获取语言页和代码页

  18. struct LANGANDCODEPAGE

  19. {

  20. WORD wLanguage;

  21. WORD wCodePage;

  22. } *lpTranslate;

  23. bSuccess = VerQueryValue(pData, (TEXT("\\VarFileInfo\\Translation")), (LPVOID*)&lpTranslate, &uLen);

  24.  
  25. if (false == bSuccess) {

  26. delete pData;

  27. return result;

  28. }

  29. QString str1, str2;

  30. str1.setNum(lpTranslate->wLanguage, 16);

  31. str2.setNum(lpTranslate->wCodePage, 16);

  32. str1 = "000" + str1;

  33. str2 = "000" + str2;

  34. QString verPath = "\\StringFileInfo\\" + str1.right(4) + str2.right(4) + "\\FileVersion";

  35. bSuccess = VerQueryValue(pData, (verPath.toStdString().c_str()), &lpBuffer, &uLen);

  36. if (false == bSuccess) {

  37. delete pData;

  38. return result;

  39. }

  40. result = QString::fromLocal8Bit((char *)lpBuffer);

  41. if (nullptr != pData) {

  42. delete pData;

  43. }

  44. return result;

  45. }

3.版本号的调用比较:

 
  1. int checkVersion()

  2. {

  3. QString myVersion = GetFileVertion("Vincialign.exe");

  4. int retValue = 0;

  5. bool netIsConnected = checkNetworkConnected();

  6. if (false == netIsConnected) {

  7. return retValue;

  8. }

  9. QVersionNumber myVersionNumber = QVersionNumber::fromString(myVersion);

  10. QString serverVersion = getVersionFromServer();

  11. QVersionNumber serverVersionNumber = QVersionNumber::fromString(serverVersion);

  12. if (true == serverVersionNumber.isNull()) {

  13. return retValue;

  14. }

  15. int compareVersion = QVersionNumber::compare(myVersionNumber, serverVersionNumber);

  16. if (0 > compareVersion) {

  17. CustomMsgBox* custommsgbox = new CustomMsgBox(NULL, updTitle, updContent, QMessageBox::Cancel | QMessageBox::Ok);

  18. int ret = custommsgbox->exec();

  19. switch (ret) {

  20. case QMessageBox::Ok:

  21. QDesktopServices::openUrl(QUrl(strCompanyWebSite));

  22. retValue = 1;

  23. break;

  24. case QMessageBox::Cancel:

  25. retValue = 0;

  26. break;

  27. }

  28. }

  29. return retValue;

  30. }

myVersion为读取的当前版本号,serverVersion为服务器提供的版本号。将两个QString类型转化为QVersionNumber类型 
利用int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) 
方法返回值<0,v2版本号大于v1版本号,进行更新操作。

这里利用

QDesktopServices::openUrl(QUrl(strCompanyWebSite));
  •  

打开网址进行下载更新包,并利用exit(0);退出主程序.

 
  1. bool checkNetworkConnected()

  2. {

  3. QNetworkConfigurationManager mgr;

  4. return mgr.isOnline();

  5. }

  •  

利用QNetworkConfigurationManager 进行判断网络是否连接。

 

https://blog.csdn.net/u012803067/article/details/77069742

你可能感兴趣的:(QT转载博文)