我已經做了DLL與VC++ 2008年,當我在控制檯應用程序中使用VC++ 6.0,有一個例外:我可以使用VC++ 2008創建DLL並在VC++ 6中使用它嗎?
(MSVCR90.DLL):0000005:訪問衝突
我已經做了DLL與VC++ 2008年,當我在控制檯應用程序中使用VC++ 6.0,有一個例外:我可以使用VC++ 2008創建DLL並在VC++ 6中使用它嗎?
(MSVCR90.DLL):0000005:訪問衝突
Access Violation
在這種情況可能意味着很多事情,並且參考msvcr90.dll
可能是非常誤導。如果您將無效數據傳遞給任何MSVC標準庫函數,則訪問衝突將發生在msvcr90.dll
而不是您的代碼中(當查看堆棧跟蹤或查看異常信息時)
也就是說,從理論上講,在VC++ 6中使用VC9 DLL是一個問題,因爲ABI沒有改變,PE格式也是一樣的。如果您的平臺上不支持msvcrt9.dll
(例如,如果您在Windows上運行MSVC6 NT),但除此之外,它意味着你需要檢查你的代碼
我的意思是:!附加一個調試器,看看發生了什麼場景下
還有一點需要注意:當動態使用不同版本的MSVC庫時,您不得在一個庫中分配數據並將其釋放到另一個庫中,因爲它們不能保證使用相同的堆,並且可能會導致內存損壞(並出現Access Violation
錯誤)這樣很容易。這也意味着,如果你正在編寫C++,你不能創建一個對象,然後通過返回值將它傳遞給調用應用程序,因爲這將在幕後發生。
謝謝馬哈茂德,你的筆記真的幫了我。我發送和接收文本到Dll函數作爲一個std ::字符串,當我發送和接收它爲char *問題解決。 – 2012-04-02 19:02:38
這幾乎總是最大的罪魁禍首。很高興我能幫上忙。 – 2012-04-02 19:37:40
馬哈茂德,再次抱歉,我需要一些幫助。我發送文本到我的DLL並接收它爲char *,有一個奇怪的事情發生,如果文本少於13個字符或超過77個字符返回的文本是垃圾! – 2012-04-03 10:06:26
如果你想建立使用Visual C一個DLL ++版本X,並用它在Visual C++版本Ÿ,你有一些選擇:
重要的是要指出,the code which allocates memory and the code which frees memory must use the same allocator。
我從來沒有嘗試過,但如果我猜測那麼我認爲我們不能,因爲即使我們在VS2008和VS2006中編寫C++程序的方式有很多差異,例如2006年,我們的頭文件帶有.h擴展名,但不是但主要問題是爲什麼你想從2008年到2006年? – 2012-04-02 16:18:50
也許,也許不是。如果您在設計界面時確實非常小心,那肯定是可以的。但在一般情況下 - 不,它不會起作用。 – 2012-04-02 16:22:34
該DLL是非託管代碼。 – 2012-04-02 16:28:58