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

时间:2015-04-14 18:57:02

标签: c++ visual-c++ visual-studio-2013 windows-runtime dependencies

我在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 dependency removal?,但答案不完整或过时。

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

1 个答案:

答案 0 :(得分:0)

这不是完美的,但现在也会这样做。

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

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

然后在Solution Explorer中右键单击该项目,然后选择Properties 点击Configuration下拉菜单,然后选择All ConfigurationsConfiguration 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:\windows\system32\MSVCR120.DLL

<强>更新 没关系。您不必分发VC ++ Runtime DLL文件的副本,只需将项目配置为静态链接到运行时库。
Here解释了如何做到这一点。如果你计划在Windows XP上执行,你仍然需要更改Platform Toolset