2017-08-28 78 views
0

目前我有一個第三方Visual Studio應用程序是基於Visual Studio 2005構建的,此應用程序使用我們的DLL中的一個插件框架。 最近這個DLL(客戶端)建立在Visual Studio 2015上,這會導致第三方應用程序崩潰嗎?建立在MS Visual Studio 2005上的C++ Exe是否可以動態加載建立在Visual Studio 2015上的DLL

有人能解釋的Visual C運行時間在這種情況下

+7

***這會導致第三方應用程序崩潰嗎?***它可以因爲標準庫在Visual Studio版本之間不兼容(2015年之前)。你將有超過1個CRT。如果內存分配/釋放對dll是孤立的,那麼對後一個問題應該沒問題。如果他們不是UB,因爲你不能在1堆中分配內存並將其釋放到不同的堆中。 – drescherjm

回答

0

++是如何工作的它實際上不是一個運行時。真正在DLL加載時,如果接口匹配,如果DLL內置在VS2015或VS2005中,則沒有區別。

只有當庫具有類C或類COM接口時,它們纔會匹配。

此外,作爲已經在評論中提到的,CRT庫不兼容,但可以有一個解決方案:

任何DLL可以針對不同的CRT版本的鏈接,這就是與/ MT/MD/MTD規定所以選項https://msdn.microsoft.com/en-us/library/2kzt1wy3(v=vs.140).aspx如果您的庫與CRT(即/ MT或/ MTd)具有靜態鏈接,則它不會與外部環境發生衝突。然而,爲了成功,你的圖書館沒有權利釋放任何從環境中獲得的內存,也不允許該環境釋放從你的庫中獲得的內存。它通常意味着遵循以下規則:分配內存的庫必須釋放它。作爲解決方法,您可以使用HeapAlloc函數。

此外值得一提的是,如果您在任何STL容器的接口中使用,則沒有任何成功的機會。 (std :: vector,map,set等),因爲自2005年以來它們發生了巨大的變化。

如果你有一個關於CRT不兼容的問題,你可以嘗試使用def files來精確指定要導出的函數和變量。你最好有C接口(你可以使用extern「C」構造來確保符號修改不會增加更多麻煩)

相關問題