1

Directx11IDXGISwapChainをフックしようとしています。Direct3DHookライブラリとEasyHookを使用してスクリーンショットを取得するために提示します。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());
    }
    .......                                    
}
4

1 に答える 1

0

エラーを見つけたと思います。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 呼び出しを発行し、2 つの呼び出しが非同期で開始されると例外が発生するためです。ThreadPool 呼び出しを削除したところ、問題なく動作しました。

于 2013-01-14T23:34:25.960 に答える