VC++創(chuàng)建msi文件的方法
采用VC++可以編寫自己軟件的安裝程序。這里只是創(chuàng)建安裝程序類型的msi文件,用orca打開是正確的文件格式,值得自己記錄一下了,msi數(shù)據(jù)庫(kù)里面的各種表關(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)鏈接庫(kù)dll與調(diào)用方法實(shí)踐
- Visual Studio 如何創(chuàng)建C/C++項(xiàng)目問(wèn)題
- 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++語(yǔ)言創(chuàng)建DLL動(dòng)態(tài)鏈接庫(kù)圖文教程
- VC++6.0中創(chuàng)建C++項(xiàng)目的實(shí)現(xiàn)步驟
相關(guān)文章
Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程
這篇文章主要介紹了Mac OS X 10.8 中編譯APUE(Unix環(huán)境高級(jí)編程)的源代碼過(guò)程,對(duì)于用MAC學(xué)習(xí)Unix環(huán)境高級(jí)編程的同學(xué)會(huì)有些作用,需要的朋友可以參考下2014-09-09
在std::thread中創(chuàng)建并管理QEventLoop的全面解析
QEventLoop的工作原理可以簡(jiǎn)單地理解為一個(gè)無(wú)限循環(huán),它會(huì)不斷地檢查是否有新的事件需要處理,如果有,就將事件從事件隊(duì)列中取出,然后找到相應(yīng)的事件處理器進(jìn)行處理,這篇文章主要介紹了在std::thread中創(chuàng)建并管理QEventLoop的全面指南,需要的朋友可以參考下2023-06-06
C++中std::find函數(shù)介紹和使用場(chǎng)景
std::find函數(shù)是一個(gè)非常實(shí)用的通用查找算法,適用于各種場(chǎng)景,本文主要介紹了C++中std::find函數(shù)介紹和使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
C++哈希表之閉散列方法的模擬實(shí)現(xiàn)詳解
閉散列指(開放定址法)發(fā)生沖突時(shí),如果哈希表沒(méi)有被填滿,則表內(nèi)一定還有其他空閑位置,可以把沖突值放到下一個(gè)沒(méi)有被占用的空余位置上。本文將模擬實(shí)現(xiàn)閉散列方法,需要的可以參考一下2022-11-11
C++實(shí)現(xiàn)高校教室管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)高校教室管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

