如何创建没有 MSVCR90D.dll 的 Win32 DLL?

问题描述 投票:0回答:5

我正在尝试使用一个简单的函数重新创建现有的 C Win32 DLL。 我已经设法使用 VS C++ 2008 Express 来完成此操作,并且我的新 DLL 可在我的 Vista 开发计算机和客户端的 XP 计算机上运行。 但是,它在其他网站上不起作用。 我检查了依赖关系,我的 DLL 需要 MSVCR90D.dll 和 KERNEL32.dll,而原始 DLL 仅需要 KERNEL32.dll。

什么是 MSVCR90D.dll,如何创建一个没有此依赖项的简单 Win32 DLL?

c winapi
5个回答
8
投票

MSVCR90D.dll 末尾的 D 表明您在调试模式下编译了 .exe。 您应该仅以发布模式分发您的应用程序。

您可以让他们安装 Microsoft Visual C++ 2008 Redistributable Package x86x64,以确保他们拥有所需的一切。 否则,您可能可以简单地通过在计算机上找到它们所需的文件来复制它们(首先检查%systemroot%\ system32)

请参阅此 MSDN 链接


3
投票

名称中的“D”表示调试。这是 Visual Studio 调试构建的明确指标。使用发布版本,一切都会好起来的。

如果目标系统还没有C运行时,通常应该使用官方安装程序将其安装在那里。您可能想了解的一些运行时版本如下:

您还可以开发一个完整的安装包,其中包括应用程序所需的可再发行 DLL(但永远不会是调试 DLL),并使用已知的技术正确地将并行 (SxS) 程序集安装到系统程序集缓存中作为合并模块。如果您完整安装了 Visual Studio(不是免费的 VS Express 版本),则此方法会更容易,但生成的安装包仍然可能无法很好地处理旧版(例如 Win 2K 或 9x)平台上的运行时安装。 MSDN 文章

重新分发 Visual C++ 文件

描述了规则是什么,以及如何尽可能轻松地遵守它们。它提供了一个了解更多与部署相关的许多问题的起点。 如果您要替换其功能的原始 DLL 没有对 MSVCR90.DLL 的引用,则它必须已静态链接到运行时。您可能应该检查将调用您的 DLL 的预期应用程序的假设。在单个进程中混合 C 运行时库并不总是那么容易。如果托管应用程序已经在使用 MSVCR90.DLL,那么您确实也应该这样做。然而,这是一个比当前具体问题的答案更大的问题,因此我鼓励您研究它并根据需要提出新问题。

避免安装后期运行时 DLL 的另一种方法是链接到 MSVCRT.DLL,它作为系统组件随现代版本的 Windows 一起分发。这是 Visual C 6.0 附带的运行时,针对关键问题进行了轻微更新,并保持最新以匹配操作系统。它根本不适用于 64 位构建,并且很难欺骗 Visual Studio 使用它来代替较新的运行时。


2
投票


0
投票


0
投票

但是,可以制作依赖于 MSVCR90.DLL(该 DLL 的非调试版本)的调试 DLL。为此(VS 2008 SP1,其他 VS 的说明类似):

转到“项目属性”(在“解决方案资源管理器”窗格中右键单击该项目,从菜单中选择“属性”)。
  1. 进入配置属性\C/C++\代码生成。
  2. 在“运行时库”下,您可能选择了“多线程调试 DLL”。将其更改为“多线程 DLL”。
  3. 您必须重新编译所有内容,但您现在应该链接到非调试 VS DLL。

© www.soinside.com 2019 - 2024. All rights reserved.