[英]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.