检测到Pinvoke堆栈不平衡

时间:2011-10-19 18:27:13

标签: stack 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);

2 个答案:

答案 0 :(得分:2)

不能肯定地说,但一个显而易见的可能性是你在64位机器上intwParam的错误类型。它必须是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。