2017-07-18 58 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