0

次のBitBltP/Invoke 宣言を使用します。

[DllImport("gdi32.dll")]
static extern int BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, 
    int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);

そして、次の呼び出しコード:

if (0 == BitBlt(hdc1, 0, 0, 856, 2246, hdc2, 0, 0, (uint)RasterOpMode.SRCCOPY))
{
    var lastError = Marshal.GetLastWin32Error();
    ...
}

BitBlt()ofから結果を得ていますが、 of0も得ています。lastError0

の戻り値のドキュメントBitBltは次のとおりです。

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、 を呼び出しますGetLastError

もちろん、マネージ コードから を呼び出しMarshal.GetLastWin32Error()ますよね?そのため、MSDN ドキュメントの下部にあるコミュニティを支持しています。BitBlt()代わりに返すように定義しようとしましboolたが、同じように動作します。

この同じコードは、Visual Studio 開発 Web サーバーを介してデバッグする場合、2 つの独立した開発者のマシンで正常に動作しますが、IIS サーバーでは失敗します。コードと渡されたパラメーターと戻り値の正確な状況を確認するために、リモート デバッグを行っています。

の直後の呼び出しでも 0 が返される (エラーがないことを示す) のに、(エラーを示す) がBitBlt返されるのはなぜですか?0Marshal.GetLastWin32Error()

それらはすべて 64 ビットの Windows 7/2008 マシンです。IIS を 32 ビット モードで実行しています。

ありがとう!

4

1 に答える 1

2

Marshal.GetLastWin32Error()[DllImport]がある場合にのみ確実に機能しますSetLastError = true。そうしないと、最後に取得されたエラーが、その間に発生した他の API 呼び出しに実際に属している可能性があります。のデフォルトSetLastErrorfalseであるため、明示的に次のように言う必要があります。

[DllImport("gdi32.dll", SetLastError = true)]
static extern int BitBlt (...)
于 2013-06-26T20:31:44.607 に答える