【问题标题】:Converting Direct2D texture to memory stream crashes the app将 Direct2D 纹理转换为内存流会使应用程序崩溃
【发布时间】:2013-01-15 07:34:25
【问题描述】:

我正在尝试使用 Direct3DHook 库和 EasyHook 连接 Directx11 IDXGISwapChain.Present 以获取屏幕截图。我猜 Direct3DHook 是为单个屏幕截图编写的,我正在尝试扩展它以获取屏幕截图流。在最初的几个屏幕截图之后,主机应用程序在随机渲染堆栈处获得异常。

我可以将错误隔离到文件 DXHookD3D11.cs 中的以下代码:

using (MemoryStream ms = new MemoryStream())
{
    // This line crashes the main program, removing this makes the program not crash               
    res = Texture2D.ToStream(textureDest.Device.ImmediateContext, textureDest, ImageFileFormat.Bmp, ms).Code;
    if (res != 0)
    {
        // this debugmessage never gets printed
        this.DebugMessage("PresentHook: ERror in Tostream " + res.ToString());
    }
    .......                                    
}

【问题讨论】:

    标签: directx-11 easyhook


    【解决方案1】:

    我想我发现了错误。 Direct3DHook 使用线程池来运行上面的代码。

    ThreadPool.QueueUserWorkItem(delegate
    
    
                                {
    
                                    
                                   using (MemoryStream ms = new MemoryStream())
    
    
                                    {
    
    
                                        Texture2D.ToStream(textureDest.Device.ImmediateContext, textureDest, ImageFileFormat.Bmp, ms);
    
                                        SendResponse(ms, requestId);
    
    
                                        this.DebugMessage("PresentHook: Send response time: " + (DateTime.Now - startSendResponse).ToString());
    
    
                                     }
    
    
                                     // Free the textureDest as we no longer need it.
    
    
                                    textureDest.Dispose();
    
    
                                     textureDest = null;
    
    
                                 });
    

    但是 Texture.ToStream 调用需要是单线程的,因为它在内部可能会发出单线程的 GetRenderTarget 调用,并且如果两个调用异步启动会导致异常。我删除了 ThreadPool 调用,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多