C++ 如果使用vc+编译,则DLL中存在访问冲突+;编译器版本低于VS2015

C++ 如果使用vc+编译,则DLL中存在访问冲突+;编译器版本低于VS2015,c++,visual-studio,visual-studio-2013,C++,Visual Studio,Visual Studio 2013,几个星期以来我一直在想这个问题。。。每当我使用平台格式工具集VS2013(vs120)或更低版本编译D3D代理dll时,使用此库的D3D9应用程序中就会出现访问冲突(0xC0000005)。 如果我更改为VS2015或VS2017,则不会发生异常 我的dll只包含DirectX 9接口IDirect3D9和IDirect3DDevice9(用作原始代理dll)的重新实现 我想使用VS2013的原因是我的封闭源代码D3D9应用程序是使用VS2013编译的。如果我理解正确,使用不同的VS运行时通常无

几个星期以来我一直在想这个问题。。。每当我使用平台格式工具集VS2013(vs120)或更低版本编译D3D代理dll时,使用此库的D3D9应用程序中就会出现访问冲突(0xC0000005)。 如果我更改为VS2015或VS2017,则不会发生异常

我的dll只包含DirectX 9接口IDirect3D9和IDirect3DDevice9(用作原始代理dll)的重新实现

我想使用VS2013的原因是我的封闭源代码D3D9应用程序是使用VS2013编译的。如果我理解正确,使用不同的VS运行时通常无法正常工作,这可能也是我尝试将所有对D3D9方法的调用记录到文件中导致运行时错误的原因

顺便说一下,我使用的是Windows 8.1 Pro


欢迎任何帮助

确保您的DLL是使用理想的
/LD
/LDd
(取决于它是调试版本还是发布版本)或至少是
/MD
/MDd
编译的,以使用动态链接的运行时,即不要使用
/MT
/MTd
(默认为
/MT[d]
至少在某些情况下是这样,但我目前不确定默认的DLL设置)


此外,根据应用程序期望的调用约定,您可以尝试更改默认调用约定:
/Gz
(stdcall)、
/Gr
(fastcall)、
/Gd
(cdecl)。库通常需要stdcall,但MSVC中的默认值是AFAIK cdecl,因此这也可能是问题的根源。

如果我更改为VS2015或VS2017,则不会发生异常——是时候开始调试(或学习如何调试)您的应用程序了,并查看到底是什么函数、哪一行等导致了异常。导致访问冲突的原因有很多,其中一个原因是不同的编译器在代码中发现了一个bug。显然我还不够清楚。我想使用VS2013的原因是我的封闭源代码D3D9应用程序是使用VS2013编译的。我指的是我试图拦截D3D9调用的封闭源代码应用程序。我没有抛出异常的部分的源代码。好的,我会在我再次工作时检查。但是让我提前问一下:我唯一要更改的是plattform工具集,没有其他更改。是否真的有可能/MT和/MTd与v140/v141一起工作,而与v120不一起工作?如果是,为什么?谢谢。我检查了设置-/LD和/LDd不可用,但/MD已设置。