我正在開發一個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服務器消費者使用的是什麼版本?
您能否提供一個參考,以反對VS2005中靜態鏈接運行時庫的棄用? – 2009-11-10 19:18:32
我無法找到不贊成靜態庫的引用。我的第一個斷言可能是錯誤的。當我遇到第三方dll和VS2005運行時的問題時,我閱讀了所有內容,我可能會合並靜態運行時庫和(現在已經過時的單線程運行時庫)。靜態運行時庫很好,但如果將應用程序跨越不同的dll,則會導致問題。 – iain 2009-11-11 15:33:55
好吧,我知道他們不鼓勵它,因爲可能存在一些舊的庫錯誤,這些錯誤不會被系統更新修復,但有時(分發一個.exe)只需要簡單一些就可以不必執行整個安裝,管理特權的並排組件。庫修復只是通過重建的.exe分發。 – 2009-11-12 10:22:46