2017-07-18 22 views
0

我想弄清楚這幾個星期了......每當我用plattform工具集VS2013(vs120)或更低版本編譯我的D3D代理DLL時,我得到一個訪問衝突(0xC0000005)在使用此庫的D3D9應用程序中。 如果我更改爲VS2015或VS2017,則不會發生異常。如果使用低於VS2015的vC++編譯器進行編譯,DLL中的訪問衝突

我的dll只包含DirectX 9接口IDirect3D9和IDirect3DDevice9(作爲原始代理dll)的重新實現。

我想使用VS2013的原因是我的閉源D3D9應用程序已經使用VS2013編譯。如果我正確理解使用不同的VS運行時通常不能正常工作,這可能也是我所有嘗試將所有調用D3D9方法記錄到文件導致運行時錯誤的原因。

順便說一句,我在Windows 8.1 Pro上。

歡迎任何幫助!

+0

*如果我更改爲VS2015或VS2017,則不會發生異常* - 是時候開始調試(或學習如何調試)您的應用程序,並確切瞭解哪些函數,哪條線路等導致異常。訪問衝突可能由多種原因引起,其中之一是由不同編譯器顯示的代碼中的錯誤。 – PaulMcKenzie

+0

顯然我還不夠清楚。 _我想使用VS2013的原因是我的封閉源代碼D3D9應用程序已經使用VS2013編譯._因此,我的意思是我試圖攔截D3D9調用的封閉源代碼應用程序。我沒有提供引發異常的部分的源代碼。 – Apollo13

回答

0

請確保您的DLL與理想/LD/LDd編譯(取決於它是否是調試或發佈版本),或者至少/MD/MDd,使用動態鏈接運行,即不與/MT/MTd建(據我所知至少在某些情況下,默認爲/MT[d],但目前我不確定默認的DLL設置)。

此外,根據不同的應用所期待的調用約定,你可以嘗試更改默認調用約定玩:/Gz(STDCALL),/Gr(快速調用),/Gd(CDECL)。庫文件通常需要stdcall,但MSVC中的默認值是AFAIK cdecl,因此也可能是問題的來源。

+0

好吧,我會再檢查一次,當我再次回到工作。 但讓我提前問:我改變的唯一的東西是plattform工具集,沒有別的。/MT和/ MTd真的有可能在v140/v141上運行,而在v120下運行嗎?如果是,那爲什麼?謝謝。 – Apollo13

+0

我檢查了設置 -/LD和/ LDd不可用,但/ MD被設置。 – Apollo13