VC++ MFC程式設計版本資訊控制

yousss發表於2018-08-29

VC++ MFC程式設計版本資訊控制

一、工程中新增版本資訊

 

 

         綠色框內為檔案本件(FileVersion),紅色框為產品版本(ProductVersion),兩者的區別是一個檔案可能包含多個產品,所以一般我們是獲取軟體的產品版本(ProductVersion)實現版本的控制。

         需要注意的是不管是FileVersion還是ProductVersion,在兩個框內的資訊必須一致,不然可能會出現意想不到的問題。

 

二、資料庫中新增版本資訊

 

 

         資料庫建表的操作我這邊就不做詳細介紹了,這裡使用的是Sqlserver2005資料庫,表名為ToolVersionList,表的資料型別為Varchar,版本格式如圖1.0.4,與第一步中的ProductVersion一致。

 

三、編寫程式碼

         這裡沒有連線資料庫的相關內容操作,如果還不知道怎樣連線資料庫的同學可以參考我介紹連線資料庫的文章,這裡就不做詳細介紹了。

BOOL CheckToolVersion()

{

         CString     csVer;

         CString     strVersion ;

         CString     sql;

         _variant_t  var;

         TCHARszFullPath[MAX_PATH];

         DWORDdwVerInfoSize = 0;

         DWORDdwVerHnd;

         VS_FIXEDFILEINFO* pFileInfo;

        

         //從資料庫中獲取最新軟體版本

         try

         {

                   sql.Format("select* from ToolVersionList where Enable = 1");

                   if(m_pRst->State)

                            m_pRst->Close();

                   m_pRst=m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);

 

                   if(!m_pRst->adoEOF)

                   {

                            var= m_pRst->GetCollect("MaintenanceTool");

                            csVer= (LPCTSTR)(_bstr_t)var;

                   }

                   if(m_pRst->State)

                            m_pRst->Close();

         }

         catch(_com_errore)

         {

                   returnFALSE;

         }

 

         //獲取當前軟體版本

         GetModuleFileName(NULL,szFullPath, sizeof(szFullPath));

         dwVerInfoSize= GetFileVersionInfoSize(szFullPath, &dwVerHnd);

     if (dwVerInfoSize)

     {

                   HANDLE  hMem;

                   LPVOID  lpvMem;

                   unsignedint uInfoSize = 0;

                  

                   hMem= GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);

                   lpvMem= GlobalLock(hMem);

                   GetFileVersionInfo(szFullPath,dwVerHnd, dwVerInfoSize, lpvMem);

                  

                   ::VerQueryValue(lpvMem,(LPTSTR)_T("\\"), (void**)&pFileInfo, &uInfoSize);

                  

                   WORDm_nProdVersion[3];

                  

                   m_nProdVersion[0]= LOWORD(pFileInfo->dwProductVersionMS);

                   m_nProdVersion[1]= HIWORD(pFileInfo->dwProductVersionLS);

                   m_nProdVersion[2]= LOWORD(pFileInfo->dwProductVersionLS);

                  

                   strVersion.Format(_T("%d.%d.%d"),m_nProdVersion[0],m_nProdVersion[1],m_nProdVersion[2]);

                  

                   GlobalUnlock(hMem);

                   GlobalFree(hMem);

         }

        

         //版本對比

         if(strVersion != csVer.Right(5))

         {

                   AfxMessageBox("該軟體版本不是最新,請使用最新版本"+csVer+"!");

                   returnFALSE;

         }

 

         returnTRUE;

}

 

 

         這個函式可以放在工程初始化連線好資料庫之後呼叫,實現對版本的控制,每次更新可以把版本加1,這樣可以確保在實際專案中使用的是最新的軟體,謝謝。

         此文章只是個人在實際專案中所總結的一點小小經驗,程式碼不是非常的嚴謹,覺得有幫助的可以參考一下,覺得有問題的可以給我留言,便於我做出改善,大家相互學習。

相關文章