8

私はこのコードスニペットを持っています:

internal class MTool : NativeWindow
{
    private const int WM_LBUTTONDOWN = 0x0201;
    public event TipDeactivateEventHandler Deactivate;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {           
        if( m.Msg == WM_LBUTTONDOWN )
        {
            if( this.Deactivate != null)
            {
                this.Deactivate();
            }
        }

        base.WndProc(ref m);
    }
}

プログラムを実行すると、その行で AccessViolationException エラーが発生し、そのbase.WndProc(ref m);理由がわかりません。

どうやらこれは .NET 2.0 から 4.0 に移植されたようで、私の理論では、WndProc をオーバーライドする代わりに現在使用されている別の方法があるかもしれません。この場合ですか?そうでない場合、なぜこの例外が発生するのですか?

4

3 に答える 3

7

メソッドの上にこの属性を追加して修正しました:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]

次に、例外が発生した行を try/catch で囲みます。この情報はこちらで見つけました。

于 2012-08-20T19:39:17.207 に答える
2

のドキュメントは、WndProc完全な信頼を要求していることを示しています。あなたはそれを試しましたか?例えば:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
internal class MTool : NativeWindow
{
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
//...
于 2012-08-20T17:25:03.833 に答える
0

あなたのコードでもっと大きなことが起こっているのではないかと思います。あなたのスニペットに基づいて、私は試してみます:

  1. WndProcオーバーライドをコメントアウトしますが、これは他の場所でクラッシュすることで再現されますか?
  2. WndProcが「base.WndProc(refmsg)」のみを呼び出すようにします。それでも同じエラーが発生しますか?コールスタックとは何ですか?スタックのより深いところにコードがありますか?
  3. スニペットをそのまま使用すると、これはWM_LBUTTONDOWNの場合にのみ発生しますか?これがその例外をスローするとき、その非アクティブ化ハンドラーに何がフックされますか?

これらを試すのが現実的でない場合は、スニペットを更新して、何をしようとしているのかをよりよく説明する必要があります。

于 2012-08-20T18:04:29.027 に答える