当前位置:  编程技术>c/c++/嵌入式

VC++创建msi文件的方法

    来源: 互联网  发布时间:2014-10-25

    本文导语:  采用VC++可以编写自己软件的安装程序。这里只是创建安装程序类型的msi文件,用orca打开是正确的文件格式,值得自己记录一下了,msi数据库里面的各种表关系复杂,不是一时半刻能研究清楚的。本文仅作一浅析,实现写一个...

采用VC++可以编写自己软件的安装程序。这里只是创建安装程序类型的msi文件,用orca打开是正确的文件格式,值得自己记录一下了,msi数据库里面的各种表关系复杂,不是一时半刻能研究清楚的。本文仅作一浅析,实现写一个程序附到软件程序的后面,这样可以在编译完成后直接会有安装程序msi文件。就像平常下载的软件,可以写注册表,创建桌面快捷方式,注册各种软件用到的组件和功能。

具体示例程序如下:

#pragma once
//CRT headers.
#include 
//windows platform headers.
#include 
//msi headers.
#pragma comment(lib,"msi.lib")
#include 
#include 
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;
}

本程序仅实现简单的基本功能,读者可根据自身的需要进一步开发其他个性化功能,以满足自身需求。


    
 
 

您可能感兴趣的文章:

  • 一进程源源不断地创建文件,另一进程把这些创建的文件抓取并挪走
  • 在程序建立的文件夹里,程序自己无法创建文件?
  • mkdir()是创建文件夹的函数,有没有循环创建多个目录级的函数呢?
  • FTP上创建的文件夹的创建日期始终和本机的对不上(无论如何改变日期和时间)(紧急!!!)
  • 在LINUX的虚拟文件系统下如何创建一个文件?
  • 根据文件创建时间顺序删除文件? 急急急
  • linux普通用户创建文件或目录
  • 编程在软盘上创建文件,为什么实际的文件名总不能大于8个字符呢?
  • 习题求解答:如何创建一个名为-i的文件?如何删除该文件(还有一个)
  • 怎么创建这样一个文件???有分送,请指教
  • 怎么用shell创建连续文件名的文件??
  • 怎么用函数得到一个文件的创建者
  • 没有路径的情况下创建的文件的默认路径是和程序生成可执行文件在同一个目录中是吗?。
  • 自行创建的设备文件怎么在系统重启后不见了?
  • patch文件在打补丁的时候,把新文件创建到原来的目录?
  • 如何设定(或更改)用户创建文件时的缺省权限???
  • 菜鸟问题:怎样创建一个对所有文件只有只读权限的linux帐号,谢谢!
  • 请问删除与创建文件的函数是哪两个?
  • 求助:如何快速创建一个大文件?
  • 请问如何创建文件?
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • navicat 8 创建数据库与创建用户分配权限图文方法
  • 关于“创建重载现存方法的方法”
  • sql server创建复合主键的2种方法
  • Mysql启动与数据库的创建方法[图文]
  • IIS打开提示MMC无法创建管理单元的解决方法
  • python创建只读属性对象的方法(ReadOnlyObject)
  • linux下什么方法可以获取文件的创建时间呢?
  • MySQL 创建索引(Create Index)的方法和语法结构及例子
  • Codeigniter中mkdir创建目录遇到权限问题和解决方法
  • java线程之使用Runnable接口创建线程的方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Bitsets 成员 Constructors:创建新bitsets
  • 菜鸟在c盘装了win2000,想在剩下的空间装Red Hat Enterprise Linux 3,在创建linux分区的时候,不知道都创建什么分区??我知道要创建一个
  • C++ Double Ended Queues(双向队列) 成员 Constructors:创建一个新双向队列
  • 创建用户组创建用户出错
  • C++ I/O 成员 open():创建一个输入流
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • Xcode介绍及创建工程和工程依赖操作步骤
  • linux如何创建一个共享内存 可以mount 可以创建目录之类 跟硬盘分区一样
  • HTML5 sprite 样式创建工具Stitches介绍
  • php循环创建目录示例分享(php创建多级目录)
  • java Servlet实现Session创建存取以及url重写代码示例
  • sql server 2008:您对无法重新创建的表进行了更改或者启用了“阻止保存重新创建表的更改”
  • 急!linux下mysql的创建用户组和创建用户命令不能生效啊????
  • 怎么创建包,我创建包后,怎么找不到呢?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 100求解:如何在UNIX环境下创建一个新的端口号?另:能告之如何在WINDOWS2000环境下创建一个新的端口号就更好了!
  • mkdir函数参数问题,创建目录权限不正确
  • 创建进程的系统调用clone()和fork()
  • 创建一个用户赋予仅仅读部分目录权限,不能创建或者删除任何文件
  • 线程这样创建行吗?
  • Linux创建进程的问题,请高手帮忙解答一下?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3