VC++ 创建msi文件

  • 编写自己软件的安装程序

  • 这里只是创建安装程序类型的文件,当然创建出来也是不能用的。找了好多天资料,看了好多天英语,终于能创建出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>
    
  •   结果展示

  • 总结

  •  现在我研究的还不是很明白,不过最终的目的就是自己编写的软件需要一个安装程序,这样子就看着专业一些了,总是绿色软件很是不甘心。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当当小螳螂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值