【问题标题】:Package a .exe file with in a msi file将 .exe 文件打包到 msi 文件中
【发布时间】:2016-02-22 10:51:12
【问题描述】:

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

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

希望以编程方式执行此操作。或者也欢迎任何以非程序化方式做同样事情的想法:)

【问题讨论】:

  • 您可以将 .exe 文件打包到另一个 .exe 文件中,也可以将 .msi 打包到 .exe 中
  • @BarmakShemirani:你是对的。我正在寻找how to do it 类型的文档。你知道一些我可以参考的网站或文档吗

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


【解决方案1】:

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

无需编码

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

【讨论】:

    【解决方案2】:

    制作一个名为"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;
    }
    

    在发布模式下,进入“项目属性”->“代码生成”->“运行时库”,并选择“多线程(/MT)”,这样*.exe文件就可以在没有依赖关系的情况下运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多