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