我遇到了一个奇怪的问题......我正在尝试实现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。什么都行不通......
由于 [R
答案 0 :(得分:1)
我终于找到了一个显示正确技术的article。不仅对象必须是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);
这很容易,不是吗?它有效:)