0

奇妙な問題が発生しました... Windows Vista+ の Recovery API を実装しようとしています。基本的には機能します。しかし、「RegisterApplicationRecoveryCallback」を呼び出そうとするたびに、StackImbalance 例外が発生します。

通常は無視できますが、デバッガーなしでプログラムを実行すると、スタックのバッファーオーバーフローなどが原因でクラッシュします...

    [UnmanagedFunctionPointer(CallingConvention.Winapi)]
    public delegate uint ApplicationRecoveryCallback(object pvParameter);

    [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi)]
    public static extern uint RegisterApplicationRecoveryCallback([MarshalAs(UnmanagedType.FunctionPtr)]ApplicationRecoveryCallback pRecoveryCallback,
        object pvParameter,
        uint dwPingInterval,
        uint dwFlags);

これが私の PInvoke の実装です。それが私の呼びかけです:

result = RecoveryAPI.RegisterApplicationRecoveryCallback(ApplicationRecovery, null, 5000, 0);

うまくいきません。私はすでにコンベンションをCDeclとThisCallに設定しようとしました。何も機能しません...

ありがとうR

4

1 に答える 1

1

適切なテクニックを示す記事をついに見つけました。オブジェクトが IntPtr である必要があるだけではありません。デリゲートも IntPtr である必要があります。

規約を設定する必要はありません。デフォルトで動作します。Callback メソッドのインポートを次のように変更するだけです。

        [DllImport("kernel32.dll")]
        public static extern uint RegisterApplicationRecoveryCallback(IntPtr pRecoveryCallback,
        IntPtr pvParameter,
        uint dwPingInterval,
        uint dwFlags);

次に、次のように呼び出します。

        RecoveryAPI.ApplicationRecoveryCallback callBack = this.ApplicationRecovery;
        IntPtr methodPtr = Marshal.GetFunctionPointerForDelegate(callBack);
        result = RecoveryAPI.RegisterApplicationRecoveryCallback(methodPtr, IntPtr.Zero, 5000, 0);

とても簡単ですね。そしてそれは動作します:)

于 2013-05-25T16:57:18.930 に答える