VC++創(chuàng)建msi文件的方法
采用VC++可以編寫自己軟件的安裝程序。這里只是創(chuàng)建安裝程序類型的msi文件,用orca打開是正確的文件格式,值得自己記錄一下了,msi數(shù)據(jù)庫里面的各種表關(guān)系復(fù)雜,不是一時(shí)半刻能研究清楚的。本文僅作一淺析,實(shí)現(xiàn)寫一個(gè)程序附到軟件程序的后面,這樣可以在編譯完成后直接會(huì)有安裝程序msi文件。就像平常下載的軟件,可以寫注冊(cè)表,創(chuàng)建桌面快捷方式,注冊(cè)各種軟件用到的組件和功能。
具體示例程序如下:
#pragma once //CRT headers. #include <TCHAR.H> //windows platform headers. #include <WINDOWS.H> //msi headers. #pragma comment(lib,"msi.lib") #include <MSI.H> #include <MSIQUERY.H> INT APIENTRY _tWinMain( HINSTANCE, HINSTANCE, LPTSTR, INT) { MSIHANDLE msiHandle=NULL; //create msi database. UINT openResult=MsiOpenDatabase( _T("Setup.msi"), MSIDBOPEN_CREATEDIRECT, &msiHandle); //create msil database failed. if(openResult != ERROR_SUCCESS) { LPVOID formatMsg=NULL; MSIHANDLE errorCode=MsiGetLastErrorRecord(); //format error code to string. FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT), (LPTSTR)&formatMsg, 0, NULL); //output error message. MessageBoxEx( NULL, (LPTSTR)formatMsg, _T("tip window"), MB_OK, MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)); //free message buffer. LocalFree(formatMsg); formatMsg=NULL; return -1; } //commit msi database. UINT commitResult=MsiDatabaseCommit(msiHandle); if(commitResult != ERROR_SUCCESS) { LPVOID formatMsg=NULL; MSIHANDLE errorCode=MsiGetLastErrorRecord(); //format error code to string. FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT), (LPTSTR)&formatMsg, 0, NULL); //output error message. MessageBoxEx( NULL, (LPTSTR)formatMsg, _T("tip window"), MB_OK, MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)); //free message buffer. LocalFree(formatMsg); formatMsg=NULL; return -1; } //close msi database handle. UINT closeResult=MsiCloseHandle(msiHandle); if(closeResult != ERROR_SUCCESS) { LPVOID formatMsg=NULL; MSIHANDLE errorCode=MsiGetLastErrorRecord(); //format error code to string. FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT), (LPTSTR)&formatMsg, 0, NULL); //output error message. MessageBoxEx( NULL, (LPTSTR)formatMsg, _T("tip window"), MB_OK, MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)); //free message buffer. LocalFree(formatMsg); formatMsg=NULL; return -1; } return 0; } </SPAN>
本程序僅實(shí)現(xiàn)簡(jiǎn)單的基本功能,讀者可根據(jù)自身的需要進(jìn)一步開發(fā)其他個(gè)性化功能,以滿足自身需求。
- VS2019創(chuàng)建C++工程的的實(shí)現(xiàn)步驟
- VS2019創(chuàng)建c++動(dòng)態(tài)鏈接庫dll與調(diào)用方法實(shí)踐
- Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問題
- c++利用vector創(chuàng)建二維數(shù)組的幾種方法總結(jié)
- Visual Studio 2022 的安裝和創(chuàng)建C++項(xiàng)目(圖文教程)
- VS2019如何創(chuàng)建C++項(xiàng)目的實(shí)現(xiàn)示例
- 探索Visual C++下創(chuàng)建WPF項(xiàng)目的方法示例
- 如何使用visual studio2019創(chuàng)建簡(jiǎn)單的MFC窗口(使用C++)
- Visual Studio 2019創(chuàng)建C++ Hello World項(xiàng)目的方法
- 在Visual Studio中用C++語言創(chuàng)建DLL動(dòng)態(tài)鏈接庫圖文教程
- VC++6.0中創(chuàng)建C++項(xiàng)目的實(shí)現(xiàn)步驟
相關(guān)文章
Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過程
這篇文章主要介紹了Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過程,對(duì)于用MAC學(xué)習(xí)Unix環(huán)境高級(jí)編程的同學(xué)會(huì)有些作用,需要的朋友可以參考下2014-09-09在std::thread中創(chuàng)建并管理QEventLoop的全面解析
QEventLoop的工作原理可以簡(jiǎn)單地理解為一個(gè)無限循環(huán),它會(huì)不斷地檢查是否有新的事件需要處理,如果有,就將事件從事件隊(duì)列中取出,然后找到相應(yīng)的事件處理器進(jìn)行處理,這篇文章主要介紹了在std::thread中創(chuàng)建并管理QEventLoop的全面指南,需要的朋友可以參考下2023-06-06C++中std::find函數(shù)介紹和使用場(chǎng)景
std::find函數(shù)是一個(gè)非常實(shí)用的通用查找算法,適用于各種場(chǎng)景,本文主要介紹了C++中std::find函數(shù)介紹和使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02C++哈希表之閉散列方法的模擬實(shí)現(xiàn)詳解
閉散列指(開放定址法)發(fā)生沖突時(shí),如果哈希表沒有被填滿,則表內(nèi)一定還有其他空閑位置,可以把沖突值放到下一個(gè)沒有被占用的空余位置上。本文將模擬實(shí)現(xiàn)閉散列方法,需要的可以參考一下2022-11-11C++實(shí)現(xiàn)高校教室管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)高校教室管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03