指定在.msi
文件中打包.exe
文件的任何指针?在msi文件中打包一个.exe文件
当我点击.msi
文件时,它应该执行.exe
文件(它被打包在.msi
文件中)。
愿意以程序化的方式做到这一点。或者任何想法以非编程方式做同样的事情也是受欢迎的:)
指定在.msi
文件中打包.exe
文件的任何指针?在msi文件中打包一个.exe文件
当我点击.msi
文件时,它应该执行.exe
文件(它被打包在.msi
文件中)。
愿意以程序化的方式做到这一点。或者任何想法以非编程方式做同样的事情也是受欢迎的:)
制作一个名为"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文件可以运行而不依赖。
您可以使用高级安装程序轻松完成此操作,其中有一个教程convert EXE to MSI,它实际上为您创建了一个MSI包装程序EXE。
无需编码是必需的。
您可以在这个包装中放置多个EXE安装程序,以链接它们的执行。另外,对于每个EXE,您可以通过命令行开关使其安装无声(如果EXE支持此类开关),则可以获得支持完全自动化以安装EXE的MSI。
您可以将.exe文件打包到另一个.exe文件或.exe内的.msi文件中.exe –
@BarmakShemirani:你说得对。我正在寻找一种“如何做到这一点”的文档。你知道我可以参考的一些网站或文档吗? –