我正在尝试用一个简单的函数重新创建一个现有的C Win32动态链接库。我已经成功地使用VSVista2008Express做到了这一点,并且我的新C++可以在我的Vista机器和客户端的XP机器上工作。然而,它在其他网站上不起作用。我检查了依赖关系,我的DLL需要MSVCR90D.dll和KERNEL32.dll,而原来的DLL只需要KERNEL32.dll。
什么是MSVCR90D.dll,如何在没有此依赖项的情况下创建一个简单的Win32 DLL?
发布于 2009-05-12 20:43:54
链接到C运行时库的静态版本。该设置位于项目属性中的“代码生成”下。这样你就完全不需要担心MSVCR* all了。
发布于 2009-05-12 20:17:14
MSVCR90D.dll末尾的D表示您在调试模式下编译了.exe。您应该只在发布模式下分发应用程序。
您可以通过让他们安装Microsoft Visual C++ 2008 Redistributable Package x86或x64来确保他们拥有所需的一切。否则,您可以通过在您的计算机上找到它们来简单地复制它们所需的文件(首先在%systemroot%\system32处检查)
请参阅this MSDN link。
发布于 2009-05-12 22:35:02
名称中的“D”表示调试。这是Visual Studio的Debug版本的一个明确指示器。使用发布版本,一切都会好起来的。
如果目标系统还没有C运行时,通常应该使用官方安装程序将其安装在目标系统中。您可能想了解以下运行时的一些版本:
x86
您还可以开发一个完整的安装包,其中包括应用程序所需的可重新分发的DLL(但决不是调试DLL),并使用一种称为合并模块的技术正确地处理并排(SxS)程序集在系统程序集缓存中的安装。如果您完全安装了Visual Studio (不是免费的VS Express版),则此方法会更容易,但生成的安装包可能根本不能很好地处理在较旧(如Win 2K或9x)平台上安装运行时。
MSDN文章Redistributing Visual C++ Files描述了这些规则是什么,以及如何尽可能容易地遵守这些规则。它为了解更多与部署相关的问题提供了一个起点。
如果要替换其功能的原始DLL没有对MSVCR90.DLL的引用,则它必须静态链接到运行库。您可能应该检查将调用您的DLL的预期应用程序的假设。在单个进程中混合使用C运行时库并不总是那么容易。如果宿主应用程序已经在使用MSVCR90.DLL,那么您也应该这样做。然而,这是一个比手头具体问题的答案更大的问题,所以我鼓励您研究它,并根据需要提出新的问题。
避免安装以后的运行时DLL的另一种方法是链接到MSVCRT.DLL,它作为系统组件随windows的现代版本一起分发。这是Visual C 6.0附带的运行时,针对关键问题进行了轻微更新,并保持与操作系统匹配的最新版本。它根本不适用于64位版本,而且很难诱使Visual Studio使用它来代替较新的运行时。
https://stackoverflow.com/questions/854653
复制相似问题