【问题标题】:Windows Recovery API call causes Stack ImbalanceWindows 恢复 API 调用导致堆栈不平衡
【发布时间】:2013-05-20 22:55:35
【问题描述】:

我遇到了一个奇怪的问题...我正在尝试实现 Windows Vista+ 的恢复 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。没有任何效果...

谢谢 回复

【问题讨论】:

  • 尝试将 object 参数更改为 ApplicationRecoveryCallback 和 RegisterApplicationRecoveryCallback 为 IntPtr。我猜测编组器不会将 object 直接编组为指针的大小。
  • 同样的问题......仍然是堆栈不平衡 -.-

标签: wpf pinvoke unmanaged


【解决方案1】:

我终于找到了一个article,它显示了正确的技术。不仅对象必须是 IntPtr。委托也必须是 IntPtr。

您不需要设置任何约定。它适用于默认值。 只需像这样修改回调方法导入:

        [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);

这很容易,不是吗?它有效:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多