2011-10-19 84 views
0

我有以下功能:PInvoke的堆棧不平衡檢測

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, SPoint lParam); 

它不斷抱怨的PInvoke堆棧不平衡時,下面的代碼執行:

SendMessage(EventRichTextBox.Handle, EM_GETSCROLLPOS, 0, OldScrollPoint); 

什麼會導致這個問題?

這是我SPOINT

private struct SPoint 
    { 
     public Int32 x; 
     public Int32 y; 
    } 

SPoint OldScrollPoint = default(SPoint); 
+0

什麼是SPoint定義爲?它應該是一個IntPtr或等價的。 –

回答

2

不能肯定地說,但一個明顯的可能性是,你是一個64位的機器上,並且int是錯誤的類型wParam。它需要64位過程中的64位值。我們也不知道你如何聲明SPoint。你打算通過一個指向POINT結構的指針。它看起來並不像你這樣做。

正確的簽名是:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(
    IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

你的編輯澄清,SPoint是一個結構。這顯然是錯誤的。您可以簡單地通過SPoint作爲out參數。這將是最簡單的解決方案。

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(
    IntPtr hWnd, int Msg, IntPtr wParam, out SPoint lParam); 

如果你想要一個更一般的SendMessage簽名,那麼你應該使用IntPtr如我上面所述,用Marshal.StructureToPtr

+0

對不起,該點是結構 – jprbest

+0

編輯爲解釋此/ –

1

wParam參數應該是IntPtr。但是這不是什麼觸發MDA,說謊的參數類型是好的,但你必須正確地做。結構在Windows API中通過引用傳遞,聲明lParam參數爲ref SPoint。或者如果返回結構out,則爲EM_GETSCROLLPOS。