2012-04-02 102 views
1

我已經做了DLL與VC++ 2008年,當我在控制檯應用程序中使用VC++ 6.0,有一個例外:我可以使用VC++ 2008創建DLL並在VC++ 6中使用它嗎?

(MSVCR90.DLL):0000005:訪問衝突

+0

我從來沒有嘗試過,但如果我猜測那麼我認爲我們不能,因爲即使我們在VS2008和VS2006中編寫C++程序的方式有很多差異,例如2006年,我們的頭文件帶有.h擴展名,但不是但主要問題是爲什麼你想從2008年到2006年? – 2012-04-02 16:18:50

+1

也許,也許不是。如果您在設計界面時確實非常小心,那肯定是可以的。但在一般情況下 - 不,它不會起作用。 – 2012-04-02 16:22:34

+0

該DLL是非託管代碼。 – 2012-04-02 16:28:58

回答

5

Access Violation在這種情況可能意味着很多事情,並且參考msvcr90.dll可能是非常誤導。如果您將無效數據傳遞給任何MSVC標準庫函數,則訪問衝突將發生在msvcr90.dll而不是您的代碼中(當查看堆棧跟蹤或查看異常信息時)

也就是說,從理論上講,在VC++ 6中使用VC9 DLL是一個問題,因爲ABI沒有改變,PE格式也是一樣的。如果您的平臺上不支持msvcrt9.dll(例如,如果您在Windows上運行MSVC6 NT),但除此之外,它意味着你需要檢查你的代碼

我的意思是:!附加一個調試器,看看發生了什麼場景下

還有一點需要注意:當動態使用不同版本的MSVC庫時,您不得在一個庫中分配數據並將其釋放到另一個庫中,因爲它們不能保證使用相同的堆,並且可能會導致內存損壞(並出現Access Violation錯誤)這樣很容易。這也意味着,如果你正在編寫C++,你不能創建一個對象,然後通過返回值將它傳遞給調用應用程序,因爲這將在幕後發生。

+0

謝謝馬哈茂德,你的筆記真的幫了我。我發送和接收文本到Dll函數作爲一個std ::字符串,當我發送和接收它爲char *問題解決。 – 2012-04-02 19:02:38

+0

這幾乎總是最大的罪魁禍首。很高興我能幫上忙。 – 2012-04-02 19:37:40

+0

馬哈茂德,再次抱歉,我需要一些幫助。我發送文本到我的DLL並接收它爲char *,有一個奇怪的事情發生,如果文本少於13個字符或超過77個字符返回的文本是垃圾! – 2012-04-03 10:06:26

3

如果你想建立使用Visual C一個DLL ++版本X,並用它在Visual C++版本Ÿ,你有一些選擇:

  1. 建立它公開了一個純C接口DLL。你可以在裏面使用C++ 這個DLL,但是公共接口必須是純C的(例如,你不能通過DLL邊界拋出異常)。
  2. 構建一個COM DLL(可能在ATL等工具的幫助下)。
  3. 構建使用COM狀技術一個DLL,即僅暴露從DLL抽象接口和工廠的功能(這種技術本文中的段落解釋"C++ Mature Approach: Using an Abstract Interface"在CodeProject "HowTo: Export C++ classes from a DLL",尤其是)。

重要的是要指出,the code which allocates memory and the code which frees memory must use the same allocator