VC++创建msi文件的方法

2025-05-27 0 65

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

具体示例程序如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104
#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>

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 VC++创建msi文件的方法 https://www.kuaiidc.com/75800.html

相关文章

发表评论
暂无评论