使用msi文件打包.exe文件

时间:2016-02-22 10:51:12

标签: c# .net windows windows-installer installer

.exe文件中打包.msi文件的任何指针?

当我单击.msi文件时,它应该执行.exe文件(在.msi文件中打包)。

愿意以程序化的方式做到这一点。或者也欢迎任何以非程序化方式做同样的想法:)

2 个答案:

答案 0 :(得分:1)

创建一个名为"self_extracting.exe"的单独程序,将安装文件复制到self_extracting文件的资源部分。

当您运行"self_extracting.exe"时,它将从自己的资源中提取"main.msi"并将其复制到硬盘。然后,"self_extracting.exe"将从硬盘执行"main.msi"

这是c#
中的一个例子 Self-extracting Installer

上面的例子可能过于复杂。以下是使用WinAPI执行此操作的简单示例:

创建C ++ Win32项目。

将此行添加到* .rc文件:

1 RCDATA "path_on_my_computer.msi"

构建项目时,* .msi文件将写入资源部分。如果* .msi文件发生更改,请再次编译资源文件。

您有一个* .cpp文件,如下所示:

#include "stdafx.h"//if using precompiled headers
#include <windows.h>
#include <fstream>

int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int)
{
    HRSRC hrsrc = FindResource(0, MAKEINTRESOURCE(1), RT_RCDATA);
    if (!hrsrc) return 0;

    HANDLE hglob = LoadResource(0, hrsrc);
    if (!hglob) return 0;

    unsigned int size = SizeofResource(0, hrsrc);
    if (size <= 0) return 0;

    void *ptr = LockResource(hglob);

    wchar_t* setup_file = L"path_on_user_computer.msi";
    std::ofstream f(setup_file, std::ios::binary | std::ios::out);
    f.write((char*)ptr, size);
    f.close();

    ShellExecute(0, 0, setup_file, 0, 0, SW_SHOWNORMAL);

    return 0;
}

在发布模式下,转到&#34;项目属性&#34; - &GT; &#34;代码生成&#34; - &GT; &#34;运行时库&#34;,然后选择&#34;多线程(/ MT)&#34;所以* .exe文件可以无依赖地运行。

答案 1 :(得分:1)

您可以使用Advanced Installer轻松完成此操作,有一个教程convert EXE to MSI,它实际上会为您创建一个MSI包装器。

无需编码

您可以在此包装器中放置多个EXE安装程序,以链接其执行。此外,对于每个EXE,您可以通过命令行开关使其安装无声(如果EXE支持此类交换机),因此您可以获得支持完全自动化的MSI来安装EXE。

相关问题