我应该使用我的应用程序重新分发 msvcrt.dll 吗?

2023-11-24

如果应用程序的某些库动态依赖于 msvcrt.dll,我是否应该将 msvcrt.dll 与我的应用程序一起重新分发并使用私有 dll? IE。系统的msvcrt.dll(dll hell)是否可能存在不兼容问题?应用程序针对 Windows Server 系统。


msvcrt - 是 Microsoft Visual C++ 运行时的动态库。

在 Windows 中使用 C 运行时有两种选择:

  1. 与静态运行时库的链接。
    使用/MT or the /MTdcl.exe 的选项。在这种情况下,您将不依赖于 msvcrt DLL,因此无需重新分发它。在 Visual Studio 中,右键单击项目或解决方案,属性 > C/C++->代码生成->运行时库使用多线程 and 多线程调试分别。这是更简单的方法。缺点是生成的可执行文件较大。

  2. 与动态 C 运行时库的链接。
    您将使用/MD or the /MDdcl.exe 的选项。
    在 Visual Studio 中,右键单击项目或解决方案,属性 > C/C++->代码生成->运行时库使用多线程动态链接 and 多线程动态链接调试分别。这会产生更小的 EXE,但缺点是您在安装应用程序时必须安装所需的 MSVCRT。


每个版本的 VC++ 编译器都附带一个版本的 C 运行时 (CRT)。 Visual Studio 2005 附带了 v8 编译器和 v8 CRT。 v8 的实际 DLL 是 msvcrt80.dll。对于VS2008,它是v9,动态CRT是msvcrt90.dll。但是,CRT 的更新和修补比 C/C++ 编译器更频繁。开发人员可以下载更新的 CRT,并根据它进行构建。

如果使用动态 CRT 库进行编译,MUST从 microsoft.com 下载运行时所需版本的可再发行包,并在应用程序安装过程中执行(可能是静默)安装。


在 VS2005 之前,开发人员构建的应用程序依赖于 Windows 操作系统中的 MSVCRT。这将带来 DLL 的好处(小图像大小),同时不需要在应用程序安装中传送 CRT DLL。在Windoes 2000 之前,开发人员甚至会在\Windows 安装文件夹中安装新的MSVCRT.dll。但是,在许多应用程序和操作系统之间共享 CRT 被证明是一个非常糟糕的主意。在 WinXP SP2 中,Windows 附带的 CRT 发生了显着变化,任何依赖于该版本 CRT 的应用程序都面临着崩溃的风险。

此时,微软告诉开发人员,Windows 附带的 MSVCRT.dll 是操作系统的一部分,可以随时提供服务或修补。不支持针对它构建应用程序。因此应用程序应该使用上述方法之一。

参考:

  • MSDN 上的 VC++ 参考文档.
  • 下载 MSVCRT90 v9.0.21022 (x86 VS2008) 的 redist
  • 下载 MSVCRT90 v9.0.30729.4148 (x86 VS2008 SP1) 的 redist
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该使用我的应用程序重新分发 msvcrt.dll 吗? 的相关文章

  • 在 Cygwin 软件包列表中找不到 Openssl

    这里说的是https github com joyent node wiki Building node js on Cygwin Windows https github com joyent node wiki Building nod
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 不在焦点时响应键盘? (C#、Vista)

    我正在尝试编写一个应用程序 只要按下 Shift 键 无论当前哪个应用程序具有焦点 它都会做出响应 我尝试过这个SetWindowsHookEx 与GetKeyboardState 但这两种方法仅在应用程序窗口具有焦点时才有效 我需要它在全
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用
  • 加载 DLL 及其依赖项

    如何加载 dll 及其依赖项 我不想将每个依赖的 dll 都放在 Assembly Load 中 我宁愿只加载一个 dll 然后加载依赖项 当我的应用程序启动时 上面的 dll 不会被加载 它们仅在用户执行特定操作时加载 然后冻结 gui
  • 关闭有效句柄时,AppVerifier 报告“无效句柄 - 代码 c0000008”

    我有一个简单的测试程序 在运行时会失败并出现异常AppVerifier 程序重复STD INPUT HANDLE然后尝试使用关闭它CloseHandle 该程序运行良好 无需AppVerifier返回TRUE for CloseHandle
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 创建部署时将 pod-template-hash 添加到副本集名称中的确切原因是什么?

    https kubernetes io docs concepts workloads controllers deployment creating a deployment https kubernetes io docs concep
  • Windows 中的蓝牙 AVRCP 命令会触发哪些事件

    可以这么说 只是在做一些高级侦察 对于我的潘多拉客户 Elpis http elpis adamhaile net 我支持全局媒体键 键盘上的 MediaPlayPause MediaNext 等 并且我希望能够支持AVRCP http e
  • 在有或没有 UNICODE 支持的情况下,如何在我的程序中使用 _stprintf?

    微软的 定义 stprintf as swprintf if UNICODE被定义 并且sprintf如果不 但这些函数采用不同的参数 在swprintf 第二个参数是缓冲区大小 但是sprintf没有这个 有人偷懒了吗 如果是这样 这就是
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 将 OpenBLAS 链接到 MinGW

    我正在尝试链接OpenBLAS https www openblas net 图书馆与明GW w64 https mingw w64 org Windows 上的编译器 这是我的代码 include
  • 为什么 Windows 命令 DIR 在搜索 *.tif 文件时也会输出 *.tiff 文件?

    我想使用 Windows 命令DIR为了找到唯一TIF文件 即具有扩展名的文件 tif 因此我使用以下小批处理文件 for f delims a IN dir b a d s C wolter testversion input tif d
  • Capistrano for Rails 3.1

    我正在使用 Rails 3 1 和 Capistrano 我明白了 没有这样的文件或目录 public images public stylesheets 和 public javascripts 的错误 错误 在网上搜索了一下 发现很多博
  • 在 Vista 上调用 RPC 时出现“不支持操作”

    我的应用程序使用 Microsoft RPC 进行进程间通信 当两个进程在同一台机器上运行并且一个进程尝试调用声明为 IDL 表示法 的方法时 error status t rpcMethod in pipe byte parameter
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 无法访问127.0.0.1

    我不知道这种情况何时开始发生 但结果是 127 0 0 1 无法在任何地方的任何端口上工作 例如 浏览器显示无法连接 以下是我的研究结果 localhost COMPUTER NAME 和实际 IP 地址都工作正常 我的主机文件中没有什么特

随机推荐