2009-11-10 18 views
3

我正在開發一個64位的進程內VC++ ATL COM服務器,它基本上只是將所有調用重定向到一個out-proc COM服務器。所以我的COM服務器基本上什麼都不做我選擇哪種VC++運行時版本 - 靜態還是動態?

最初它在DLL中使用C++運行時(/MD編譯器開關)。我注意到,當我將它部署在乾淨的64位Win2k3上時,regsvr32失敗並出現錯誤:LoadLibrary({fileName})失敗 - 由於應用程序配置不正確,此應用程序無法啓動。重新安裝該應用程序可能會解決此問題。

Google幫助 - 問題是VC++ 9運行時未安裝。即使msvcr90.dll與我的COM服務器位於同一目錄中,問題仍然存在。我猜是因爲搜索依賴庫的工作原理 - 它不會查找同一個目錄,我需要Windows \ System32之類的msvcr90.dll。由於這對我的部署來說是個複雜的問題,因此我轉而使用靜態鏈接的C++運行時(/ MT編譯器開關)。現在它部署得很好。 .dll文件的大小隻有110k(45k),所以它不會打擾我。

現在我已經聽到很多關於在一個進程中混合使用不同版本的C++運行時有多糟糕的問題 - CRT狀態可能被破壞,地獄可能會崩潰等等。我是否必須考慮這一點,並期望將問題從/ MD更改爲/ MT,特別是因爲我不知道COM服務器消費者使用的是什麼版本?

回答

2

據我所知,自VS2005以來,靜態運行時在VS中被棄用。

問題是,Visual C運行時是一個並排的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

安裝正確的將放置運行時動態鏈接庫中winsxs文件目錄。

+0

您能否提供一個參考,以反對VS2005中靜態鏈接運行時庫的棄用? – 2009-11-10 19:18:32

+0

我無法找到不贊成靜態庫的引用。我的第一個斷言可能是錯誤的。當我遇到第三方dll和VS2005運行時的問題時,我閱讀了所有內容,我可能會合並靜態運行時庫和(現在已經過時的單線程運行時庫)。靜態運行時庫很好,但如果將應用程序跨越不同的dll,則會導致問題。 – iain 2009-11-11 15:33:55

+0

好吧,我知道他們不鼓勵它,因爲可能存在一些舊的庫錯誤,這些錯誤不會被系統更新修復,但有時(分發一個.exe)只需要簡單一些就可以不必執行整個安裝,管理特權的並排組件。庫修復只是通過重建的.exe分發。 – 2009-11-12 10:22:46

1

它不應該是一個問題。

靜態鏈接基本上從庫中獲取所需的函數,並將它們放入DLL的代碼中(因此增加了大小)。它應該像你在自己的代碼中編寫這些函數一樣工作。

+0

那麼運行時數據結構的二進制佈局可能有什麼區別? – 2009-11-10 12:10:53