1

これまでのところ、私のプログラムはかなりうまく機能しています。ctrl残念ながら、 + alt+を押すdelとエラーがスローされます。今、私はこの質問を読みました:

ctrl alt del 使用時の E_ACCESSDENED

コンピューターが別の画面に切り替わることが言及されています(書き込み権限はありません)。ただ、現在の画面で書き込み権限があるかどうかトレースする方法がわかりません。

私のコードは次のようになります:

void D3D::StartFrame() {
    HRESULT result;

    result = pDevice->Clear( 0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(FRAME_BG_R,FRAME_BG_G,FRAME_BG_B),0.0f,0 );
    assert( !FAILED( result ) );

    result = pBackBuffer->LockRect( &backRect,NULL,NULL );
    assert( !FAILED( result ) );
}

void D3D::EndFrame() {
    HRESULT result;

    result = pBackBuffer->UnlockRect();
    assert( !FAILED( result ) );

    result = pDevice->Present( NULL,NULL,NULL,NULL );
    assert( !FAILED( result ) );
}

現在、フレームごとに「StartFrame()」関数を実行してから、フレーム中に実行する必要があるいくつかのアクションを実行しています。最後に、描画長方形のロックを解除する「EndFrame()」関数を呼び出します。

発生するエラーは、最後のアサートから発生します (StartFrame() アサートは失敗しませんか?)。これらの関数を変更して、プログラムを続行するかどうかをプログラムに伝えるブール値を返す必要がありますか? プログラム全体を停止させる必要がありますか (これは少し奇妙に感じます)。おそらく、間違った方法でロックしている四角形を処理していますか (アサートで動作するはずです)?

エラー: アサーションに失敗しました! - !FAILED(結果)

どんな助け/アドバイスも感謝します!

4

1 に答える 1

3

まず第一に、エラーが発生したときはいつでも、何かを実行する前に、何が起こったのかを考える前に、エラー メッセージが正確に何を示しているかを確認する必要があります。

DirectX 9 の場合、HRESULT変数FAILEDがあるかどうかを確認するだけでなく、そこから詳細な情報を取得する必要があります。DXGetErrorString()and/orDXGetErrorDescription()関数 ( dxerr.h+ )を使用して詳細を取得できますdxerr.lib。たとえば、小さなヘルパー関数を作成することで、エラーを処理できHRESULTます。また、簡単な解決策として優れたマクロがあります。または、最も迅速な遅延ソリューションとして、関数が失敗した直後にブレークポイントを設定し、デバッグ ウォッチャーで変数の値を調べることができます。MessageBox()FAILEDDXTrace()HRESULT

あなたの場合、投稿にエラーの説明がないため、何が起こったのかを推測することしかできません (それは、SO の担当者が最も好まないことです)。Device Lostそして、私はここの状態を疑います。この状態は、アプリがフォーカスを失ったときに発生することがあります (Alt+tab、Ctrl+Alt+Del など)。クラッシュを防ぐには、MSDNまたはこの短いチュートリアルで説明されているような例外的な状態を処理する必要があります。

もちろん、正確に何が起こったのかわからないので、私の推測は間違っている可能性があります。適切なエラー処理を追加し、具体的なヘルプを得るために追加情報を提供してください。

ハッピーコーディング!

于 2013-05-02T05:26:57.927 に答える