小编Pet*_*mer的帖子

使用 DirectX 11 后重置窗口

我编写了一个应用程序,可以在 OpenGL、DirectX 9 和 DirectX 11 之间切换进行渲染,而无需重新启动或重新创建窗口。在 OpenGL 和 DirectX 9 以及 DirectX 11 模式之间切换效果很好,但是在使用 DirectX 11 后,其他渲染模式不再有效。

\n\n

释放所有 DirectX 11 接口后,窗口仍然显示最后渲染的帧,甚至在调整窗口大小时也会正确更新。可以创建 DirectX 9 设备并且 Present 调用成功,但是,我看到的只是 DirectX 11 绘制的最后一帧。

\n\n

I\xe2\x80\x99ve 使用 IDXGIDebug::ReportLiveObjects 来确保所有 DirectX 11 接口实际上已发布。我\xe2\x80\x99ve也尝试了IDXGIFactory::MakeWindowAssociation,但它并没有\xe2\x80\x99解决问题。

\n\n

为什么最后一帧要重画,是谁重画的?我如何摆脱它并恢复窗口的原始行为。

\n\n

顺便说一句,创建一个新窗口是一种解决方法,但我想对 DirectX 9/11 和 OpenGL 使用相同的窗口。

\n

directx-11 dxgi

6
推荐指数
1
解决办法
1814
查看次数

在Windows XP下崩溃CAtlStringMgr :: GetInstance

我写了一个创建ATL CString对象的DLL.我使用Visual Studio 2015使用"Visual Studio 2015 - Windows XP(v140_xp)"平台工具集编译它.使用LoadLibrary/GetProcAddress加载DLL.

在分配字符串对象时,它在CAtlStringMrg :: GetInstance中的Windows XP下崩溃.相同的应用程序在Windows Vista及更高版本上运行良好.

这是反汇编:

    static IAtlStringMgr* GetInstance()
    {
#pragma warning(push)
#pragma warning(disable: 4640)
        static CWin32Heap strHeap( ::GetProcessHeap() );
1003B100 mov         eax,dword ptr fs:[0000002Ch] 
1003B106 mov         ecx,dword ptr [__tls_index (101B46C8h)] 
1003B10C push        esi 

*** This is the instruction that causes the crash. eax and ecx are zero. ***
1003B10D mov         esi,dword ptr [eax+ecx*4]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,代码引用了__tls_index,因此它使用了线程本地存储.dumpbin还显示了一个.tls部分,当我使用旧的Visual Studio 2013编译项目时,该部分不存在.

动态加载DLL时,Windows XP不支持线程本地存储.这解释了为什么上面的代码崩溃了.

但是,我无法弄清楚为什么使用线程本地存储.我在ATL源中找不到__declspec(thread).

我正在寻找修复/解决方法(除了从VS2015回到VS2013).

该问题已经报告给微软,但他们还没有评论/修复它:https://connect.microsoft.com/VisualStudio/feedback/details/1635157/crash-in-catlstringmrg-getinstance-under-windows-xp

c++ windows-xp atl visual-studio-2005 c-strings

5
推荐指数
1
解决办法
1114
查看次数

标签 统计

atl ×1

c++ ×1

c-strings ×1

directx-11 ×1

dxgi ×1

visual-studio-2005 ×1

windows-xp ×1