visual C++自定义安装程序(启动器)

visual C++ custom installer (launcher)

本文关键字:启动 程序 C++ 自定义 安装 visual      更新时间:2023-10-16

我用C#编写了一个可移植程序,该程序具有某些依赖项(.NET Framework、Visual C++可再发行程序等),将在Windows XP SP3及更高版本上运行。

正因为如此,程序需要一个启动器,它每次都会在实际程序运行之前运行,检查是否安装了所有必需的依赖项。如果缺少任何依赖项,将提供下载和安装该依赖项的选项。如果不存在丢失的依赖项,则执行实际程序。

启动器本身相对简单,包括一些注册表检查和一些WinAPI调用来验证已安装的依赖项。

最后的文件结构看起来像这样:

C#_compiled_portable_program.exe
C++_compiled_launcher.exe // executes on any system as low as a clean Windows XP SP3 install

问题是,我不知道如何在Visual Studio 2013中编译一个C++代码,该代码将以绝对最小的依赖关系运行(至少在Windows XP SP3附带的运行库上运行)。

以绝对最简单的C++代码为例:

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello world!");
return 0;
}

如果我用默认配置的Visual Studio 2013编译它,它将不会在没有安装VC++2013的计算机上执行,显示出一些严重的错误。

我四处寻找类似的问题,我能找到的最接近的是Visual Studio 2010 MSVCR依赖项删除?,但答案要么不完整,要么已经过时。

那么,就像安装程序一样,是否可以在Visual Studio 2013中编译一个几乎可以在任何系统上运行的C++项目?

这并不完美,但目前可以。

这就是我做的一个C++项目,在Visual Studio 2013中编译,在没有安装VC++2013的系统上执行。

我在Visual Studio 2013中创建了一个新的C++项目File>New>Project>Visual C++>Win32 Console Application

然后在"Solution Explorer"中右键单击项目并选择"Properties">
单击Configuration下拉菜单,然后选择All Configurations
Configuration Properties>General中,将Platform Toolset设置为Visual Studio 2013 - Windows XP (v120_xp)

使用Dependency Walker确定编译的exe(发布版本,而不是调试版本)导入哪些模块。导入的模块应为:

  • c:\windows\system32\KERNEL32.DLL
  • c: \windows\system32\MSVCR120.DLL

KERNEL32.DLL是一个系统文件,所以我们不必担心,而MSVCR120.DLL是Visual C++2013运行库,我们需要在发布版本的同时分发此文件。当可执行文件需要加载模块时,它首先查看该文件的当前位置,然后查看PATH(System32等)。如果我们将MSVCR120.DLL复制到发行版可执行文件所在的位置,那么即使在没有安装VC++2013的系统上,该程序也会运行。

由于该项目是一个32位应用程序,请下载VC++2013 Redistributable x86,将其安装在32位版本的Windows上(我将它安装在新的Windows XP虚拟机上),然后复制c:windowssystem32MSVCR120.DLL

更新:没关系。您不必分发VC++运行时DLL文件的副本,只需将项目配置为静态链接到运行时库即可
下面介绍了如何执行。不过,如果您计划在Windows XP上执行,您仍然需要更改Platform Toolset