如何在没有MSVCR90D.dll的情况下创建Win32 DLL?

时间:2009-05-12 20:15:56

标签: c winapi compiler-construction

我试图用一个简单的函数重新创建一个现有的C Win32 DLL。我已经设法使用VS C ++ 2008 Express,我的新DLL在我的Vista开发机器和客户端的XP机器上运行。但是,它不适用于其他网站。我检查了依赖项,我的DLL需要MSVCR90D.dll和KERNEL32.dll,其中原始DLL只需要KERNEL32.dll。

什么是MSVCR90D.dll,如何在没有此依赖项的情况下创建简单的Win32 DLL?

5 个答案:

答案 0 :(得分:8)

MSVCR90D.dll末尾的D显示您在调试模式下编译了.exe。您应该只在发布模式下分发您的应用程序。

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

请参阅this MSDN link

答案 1 :(得分:3)

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

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

您还可以开发一个完整的安装包,其中包含应用程序所需的可再发行DLL(但从不调试DLL),并处理并排(SxS)程序集到系统程序集中的安装使用称为合并模块的技术正确缓存。如果您完全安装了Visual Studio(而不是免费的VS Express版本),这种方法会更容易,但是生成的安装包仍然可能无法在较旧的(例如Win 2K或9x)平台上安装运行时。< / p>

MSDN文章Redistributing Visual C++ Files描述了规则是什么,以及如何尽可能轻松地遵守这些规则。它提供了一个起点,可以了解有关部署的许多问题。

如果要替换其功能的原始DLL没有对MSVCR90.DLL的引用,则它必须已静态链接到运行时。您可能应该检查将调用您的DLL的预期应用程序的假设。在单个进程中混合C运行时库并不总是那么容易。如果托管应用程序已经在使用MSVCR90.DLL,那么你真的也应该这样做。然而,这是一个更大的问题,而不是回答手头的具体问题,所以我鼓励你研究它并根据需要提出新的问题。

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

答案 2 :(得分:2)

与C运行时库的静态版本链接。该设置位于项目属性中的“代码生成”下。然后你根本不需要担心MSVCR * DLL。

答案 3 :(得分:0)

检查客户端的计算机是否在其系统上安装了2008运行时。如果没有,您可以将其安装在他/她的系统上,也可以使用您的应用程序静态编译运行时。

答案 4 :(得分:0)

您可能想要做的就是构建DLL的发行版,测试它,然后分发它而不是现在分发的Debug版本。

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

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