2010-04-19 93 views
16

我有一个非常简单的DLL写在非托管C++,我从我的应用程序访问。我最近切换到Visual Studio 2010,并且DLL从55k下降到35k,无需更改代码,现在它将不再加载到Windows 2000中。我没有更改任何代码或编译器设置。我有我的定义设置为0x0500,其中应包括Windows 2000支持。有没有其他人遇到过这个问题,或者对我能做什么有任何想法?问题使用Visual Studio 2010编译在Windows 2000中的C++ DLL

+0

[Visual Studio 2010的C++编译器和Visual Studio 2008的C++运行库是否可以重复使用?](http://stackoverflow.com/questions/2484511/can-i-use-visual-studio-2010s-c -compiler-with-visual-studio-2008s-c-runtime) – Suma 2010-08-17 12:08:21

回答

12

Visual Studio 2010 cannot build binaries that run on Windows 2000。它实际上比这更糟,they won't run on Windows XP RTM or Windows XP Service Pack 1 either。这是因为VS2010的C运行时库需要EncodePointer API,直到SP2才可用。

如果您想要支持早期版本的Windows,看起来您一直在安装VS2008。您可以将整个项目移动到Visual Studio 2008,也可以从Visual Studio 2010项目中将vc90(Visual Studio 2008)工具集作为目标。有关后一种方法的更多详细信息,请参阅我的相关问题here

+0

感谢您的链接,这是一些不幸的消息。 :( – 2010-04-19 00:59:14

+0

@Jon Tackabury:我知道 - 我真的很想用'auto' :( – 2010-04-19 01:01:08

+0

我只是不想让VS 2008和2010都安装。:): – 2010-04-19 01:11:43

5

解决方案可能是在单独的lib中提供EncodePointer(和DecodePointer),并将其优先链接到KERNEL32.LIB。这是一个完美支持的场景。过去,诸如“LIBCTINY”和“UNICOWS”之类的库已经使用这种优先链接机制来添加/替换来自其他库的选定但不是全部的功能。

+0

没错,我没有在写下我自己的链接主题之前,先看看你的答案,否则我不会花那么多时间与它一起玩。尽管如此,由于我的答案包含了准备使用和测试的代码,我希望它有一些用处 - 请参阅http://stackoverflow.com/questions/2484511/can-i-use-visual-studio-2010s-c-compiler -with-visual-studio-2008s-c-runtime/3502056#3502056 – Suma 2010-08-17 12:07:18

+0

一个重要的实现说明:您不直接提供EncodePointer/DecodePointer(DLL中的函数)。您需要替换它们的导入向量,这是喜欢.lib时解决的问题。它们被称为_imp__FunctionName。 – Suma 2010-08-17 19:39:40