调用 PInvoke 函数 ... 使堆栈不平衡

Posted

技术标签:

【中文标题】调用 PInvoke 函数 ... 使堆栈不平衡【英文标题】:A call to PInvoke function ... has unbalanced the stack 【发布时间】:2016-05-22 12:47:57 【问题描述】:

每次我调用函数 mouse_event 我都会得到错误

对 PInvoke 函数的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

const int MOUSEEVENTF_LEFTDOWN = 0x02;
    const int MOUSEEVENTF_LEFTUP = 0x04;
    const int MOUSEEVENTF_RIGHTDOWN = 0x08;
    const int MOUSEEVENTF_RIGHTUP = 0x10;

    [System.Runtime.InteropServices.DllImport("user32.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
    public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);


switch (mouseAction)
        
            case ENUMMouseAction.LEFTDOWN:
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                break;
            case ENUMMouseAction.LEFTUP:
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                break;
            case ENUMMouseAction.RIGHTDOWN:
                mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
                break;
            case ENUMMouseAction.RIGHTUP:
                mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
                break;
        

我已经尝试了所有可用的 CallingConventions,但似乎没有一个有效,任何帮助将不胜感激,

提前谢谢你。

【问题讨论】:

【参考方案1】:

两个错误:

调用约定应为Stdcall。 参数类型全错。前四个参数是uint,最后一个参数是UIntPtr

阅读文档时需要小心。可以在这里找到:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646260.aspx

【讨论】:

非常感谢您的帮助,我会尽快标记为答案。我只是很困惑,因为它在以前的项目中工作过,但我认为它使用的是 .NET Framework 3.5 版。 那个代码总是错的。如果它成功了,那纯属偶然。

以上是关于调用 PInvoke 函数 ... 使堆栈不平衡的主要内容,如果未能解决你的问题,请参考以下文章

C# 编组、不平衡堆栈和正确获取 PInvoke 签名

编组 LPSTR 和浮动时的不平衡堆栈

VS2010中的元帅结构指针

函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

IndexOutOfRangeException - 无法使用 PInvoke 查看调用堆栈

C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”