2013-05-25 39 views
0

我遇到了一個奇怪的問題......我試圖實現Windows Vista +的恢復API。 基本上它的工作原理。但每次我嘗試調用「RegisterApplicationRecoveryCallback」時,我都會遇到StackImbalance異常。Windows恢復API調用導致堆棧不平衡

通常情況下,你可以忽略它,但如果我沒有調試器中運行該程序,它崩潰,因爲在棧緩衝區溢出或類似的東西...

[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

嘗試更改您的'對象'參數在ApplicationRecoveryCallback和RegisterApplicationRecoveryCallback到'IntPtr'。我在猜測編組器不是直接將指針大小編組爲「對象」。 – shf301

+0

同樣的問題...仍然堆棧不平衡 - .- – SharpShade

回答

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

It's很容易,isn't呢?它的工作原理:)