2013-07-31 50 views
3

我使用Visual Studio 2012構建了基於C++的COM對象。它在64位機器上註冊並正常工作(由32位代碼調用並調用32位的進程外COM服務器),但不在32位機器上註冊(既不是XP也不是Win7 32位)。來自regsvr32的消息是無法在32位機器上註冊使用VS2012/VC++構建的COM DLL

LoadLibrary("comobj.dll") failed - The specified procedure could not be found. 

該項目最初是用Visual Studio 6(7年前)構建的。它使用ATL宏,如BEGIN_COM_MAP和BEGIN_SINK_MAP來聲明其各種接口的實現。它必須重新編譯,因爲它調用的COM服務器已更改(新的ProgID,新的GUID,新的類型庫等)。除了進行這些調整和使用當前的VS之外,沒有(有意的)更改 - 在項目文件的舊版本中沒有任何指向64位的東西。

使用64位版本的DEPENDS.EXE檢查DLL顯示標準引用的DLL(如KERNEL32和USER32)旁邊的「64」圖標。除了在64位機器上構建DLL以外,我找不到有關該DLL的「64位」。目標是明確的Win32(不是X64)。

使用32位版本的DEPENDS.EXE(在虛擬PC上運行的Windows XP上)檢查DLL顯示帶紅色圖標的KERNEL32.DLL,顯然是因爲引用了FlsAlloc FlsFree FlsGetValue FlsSetValue,它們不存在於32位KERNEL32.DLL。 (我不知道這些是什麼,不知道這些引用來自哪裏 - 也許從編譯完成的64位機器上的MFC的副本?)

難道是我必須在XP上安裝VS2012並重新編譯?如何才能真正成爲使用當前Visual Studio在C++中構建Win32 COM對象所需要做的事情?

有誰知道我可能看的地方?我已經檢查了所有的項目和解決方案選項,似乎沒有設置爲64位。 「使用MFC」下的選項設置爲「使用標準Windows庫」 - 這可能是答案,但如果它不適用於32位Windows,則幾乎不能使用「標準庫」。 (我會在發送後嘗試對其進行更改。)

在此先感謝您的任何建議。

+0

使用Visual Studio 2012構建,您需要使用['v110_xp'](http://msdn.microsoft.com/en-us/library/vstudio/jj851139.aspx)工具集來保持XP兼容。 –

+0

謝謝你的信息。當我知道這是我需要做什麼來解決這個問題時,我會更新它。 –

+0

使用這些信息我能夠讓事情順利進行。請用相同的信息添加一個答案(如果您喜歡,請刪除評論),我會將其標記爲 - 這是我能做的最不重要的事情,因爲您通過指向正確的方向爲我節省了很多時間。 –

回答

3

隨Visual Studio 2012提供的默認工具集產生的輸出與Windows XP不兼容,通過使用稍後在Vista中引入的某些API。爲了同時利用最新Microsoft C++編譯器的強大功能和豐富功能,並且仍然與Windows XP兼容,您需要使用Visual Studio 2012 Update 1中引入的備用工具集代碼「v110_xp」。在那麼可用的最新更新爲Visual Studio Update 3,並且您可能只需安裝Visual Studio的最新可用更新。

你有項目設置下可用的設置:

enter image description here

查看更多在這裏:Configuring C++ 11 Programs for Windows XP

+0

你是對的,但他的核心問題是他沒有安裝任何*更新。他仍在使用CRT的RTM版本,該版本對FlsAlloc()具有直接的動態鏈接依賴關係。您可以推薦[此鏈接](http://www.microsoft.com/en-us/download/details.aspx?id=39305) –

+0

@HansPassant:當然,我提到了更新1,但安裝最新更新是有意義的,這是更新3.我添加了上面的鏈接,謝謝。 –

+0

當我搜索VS2012的更新時,我很容易找到「更新3」 - 這個答案很有價值,因爲它指出我的方向正確。幸運的是,在「更新2」出現之後沒有問過這個問題,這違反了「更新1」提供的XP支持。我不得不做的工作是微不足道的。最大的謎團是VS2012 RTM如何在沒有 - 例如 - 默認爲「不支持XP(對於C++)」的情況下 - 在安裝對C++的支持時向您發出警告。 –