Stack 检测到Pinvoke堆栈不平衡

Stack 检测到Pinvoke堆栈不平衡,stack,pinvoke,Stack,Pinvoke,我有以下功能: [DllImport(“user32.dll”,CharSet=CharSet.Auto)] 静态外部int SendMessage(IntPtr hWnd、int wMsg、int wParam、SPoint lParam); 当执行以下代码时,它不断抱怨Pinvoke堆栈不平衡: SendMessage(EventRichTextBox.Handle,EM_GETSCROLLPOS,0,OldScrollPoint); 是什么导致了这个问题 这是我的发言人 priva

我有以下功能:

[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
静态外部int SendMessage(IntPtr hWnd、int wMsg、int wParam、SPoint lParam);
当执行以下代码时,它不断抱怨Pinvoke堆栈不平衡:

SendMessage(EventRichTextBox.Handle,EM_GETSCROLLPOS,0,OldScrollPoint);
是什么导致了这个问题

这是我的发言人

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


无法确定,但一个明显的可能性是您在64位机器上,
int
wParam
的错误类型。在64位进程中,它必须是64位值

我们也不知道您如何声明
SPoint
。您要传递指向结构的指针。看起来你没有那样做

正确的签名是:

[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
,并使用
marshall.StructureToPtr

不能确定,但一个明显的可能性是您在一台64位机器上,
int
wParam
的错误类型。在64位进程中,它必须是64位值

我们也不知道您如何声明
SPoint
。您要传递指向结构的指针。看起来你没有那样做

正确的签名是:

[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
,并使用
marshall.StructureToPtr
wParam参数应该是IntPtr。但这并不是触发MDA的原因,谎报参数类型是可以的,但您必须正确地这样做。结构在Windows api中通过引用传递,将lParam参数声明为
ref SPoint
。或者
out
如果返回结构,则EM_GETSCROLLPOS的大小写为wParam参数应为IntPtr。但这并不是触发MDA的原因,谎报参数类型是可以的,但您必须正确地这样做。结构在Windows api中通过引用传递,将lParam参数声明为
ref SPoint
。或者
out
如果返回结构,则EM_GETSCROLLPOS的情况。

SPoint的定义是什么?它应该是一个IntPtr,或者是等效的。SPoint的定义是什么?它应该是一个IntPtr,或等效的。是的,对不起,SPoint是struct。是的,对不起,SPoint是struct