这里只是创建安装程序类型的文件,当然创建出来也是不能用的。找了好多天资料,看了好多天英语,终于能创建出msi文件了,用orca打开是正确的文件格式,值得自己记录一下了,msi数据库里面的各种表关系复杂,不是一时半刻能研究清楚的,现在先记录一个开头吧。希望研究过msi c++ 编程的大神们给点指导。想实现的目标是写一个程序附到软件程序后面,这样可以在编译完成后直接会有安装程序msi文件。就像平常下载的软件,可以写注册表,创建桌面快捷方式,注册各种软件用到的组件和功能。就简单的hello world 程序也是麻雀虽小,五脏俱全就显得专业了。
#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>
原文地址:http://blog.csdn.net/yonshi/article/details/34890855