我正在开发一个64位进程内VC ++ ATL COM服务器,它基本上只是将所有调用重定向到一个外部进程COM服务器。所以我的COM服务器什么都不做。
最初,它在DLL(/MD
编译器开关)中使用了C ++运行时。我注意到当我在一个干净的64位Win2k3上部署它时,regsvr32失败并出现错误: LoadLibrary({fileName})失败 - 由于应用程序配置不正确,此应用程序无法启动。重新安装应用程序可能会解决此问题。
Google帮助 - 问题是没有安装VC ++ 9运行时。即使msvcr90.dll与我的COM服务器位于同一目录中,问题仍然存在。我猜这是因为搜索依赖库的工作方式 - 它不会查看同一目录,我需要Windows \ System32等中的msvcr90.dll。由于这是我的部署的复杂性,我转而使用静态链接的C ++运行时(/ MT编译器开关)。现在它部署得很好。 .dll文件的大小只有110k(45k),所以它不会打扰我。
现在我已经听说过很多关于在一个进程中混合不同版本的C ++运行时有多糟糕 - CRT状态可能被破坏,地狱可能会破坏等等。我是否必须考虑这一点并期待将MD / MD更改为/ MT的问题,特别是因为我不知道COM服务器消费者使用的是什么版本?
答案 0 :(得分:2)
据我所知,自VS2005以来,VS中不推荐使用静态运行时。
问题是Visual C Runtime是一个并排的dll。那就是它必须从c:\windows\winsxs
目录加载。这就是为什么将它放在同一目录中不再有效。
正确的解决方案是在客户端系统上安装正确的CRT可再发行组件。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms235316.aspx
这可能是正确的可再发行组件: http://www.microsoft.com/downloads/details.aspx?familyid=BD2A6171-E2D6-4230-B809-9A8D7548C1B6&displaylang=en
安装正确的将把运行时dll放在winsxs目录中。
答案 1 :(得分:1)
这应该不是问题。
静态链接基本上从库中获取所需的函数,并将它们放入DLL的代码中(因此增加了大小)。然后它应该像你自己在代码中编写这些函数一样工作。