2010-04-19 100 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

相關問題