我有以下功能:
[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 :(得分: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
。
答案 1 :(得分:1)
wParam参数应为IntPtr。但这不是触发MDA的原因,说谎论证类型很好,但你必须正确地做到这一点。结构在Windows api中通过引用传递,将lParam参数声明为ref SPoint
。或out
如果返回结构,则为EM_GETSCROLLPOS。