繁体   English   中英

将.exe文件打包到msi文件中

[英]Package a .exe file with in a msi file

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

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

希望以编程的方式做到这一点。 或者也欢迎以非编程方式进行相同操作的任何想法:)

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

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

这是C#中的示例
自解压安装程序

上面的例子也许过于复杂。 这是一个使用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;
}

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

您可以使用Advanced Installer轻松完成此操作,这里有一个将EXE转换为MSI的教程,该教程实际上在您的EXE上创建了一个MSI包装器。

无需编码

您可以在此包装中放置多个EXE安装程序,以链接它们的执行。 另外,对于每个EXE,您都可以传递命令行开关以使其安装保持静默(如果EXE支持此类开关),因此您可以获得支持完全自动化的MSI以安装EXE。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM