visual C++自定义安装程序(启动器)
visual C++ custom installer (launcher)
我用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
。
- 在程序和基于文本的游戏和C++内重新启动程序
- 在程序/基于文本的游戏/C++内重新启动程序
- 为什么使用 exec() 重新启动程序不能正常工作?
- 如何在 C++ 的 pacticular 目录中启动程序
- QProcess可以启动程序,但不能启动python(命令行)
- 在GDB中:在启动程序中以代码1退出.在GDB之外运行良好
- 从窗口启动程序时如何查看键盘修饰符?
- 视觉C++为什么我的文件在重新启动程序时被截断?
- 如何防止程序输出终止并重新启动程序而不会丢失数据
- 启动程序和libocci.so.11.1:无法打开共享对象文件:没有这样的文件或目录
- 无法启动程序
- 在QT中启动程序时如何创建列表或对象
- 在 CMAKE 中设置CMAKE_RUNTIME_OUTPUT_DIRECTORY后无法启动程序
- 我启动程序的方式上的不同行为
- 无法弄清楚如何为用户提供启动,停止和重新启动程序的所有选项?
- 无法启动程序.pocketsphinx.dll缺少错误
- 使用包含给定空格的路径启动程序
- 是否可以在异常(SEGFAULT)错误后自动重新启动程序
- 通过 PATH 环境启动程序.具有正确工作目录的变量
- C++启动程序而不打开控制台