制作一个名为"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文件就可以在没有依赖关系的情况下运行。