gpt4 book ai didi

c# - 如何修复 "Pinvoke stack imbalance detected"错误

转载 作者:行者123 更新时间:2023-11-30 19:18:37 24 4
gpt4 key购买 nike

我正在尝试使用 PostMessage 将 key 发送到窗口。但是在我的程序发送 key 后,我在调试窗口中收到错误消息。

出现的错误是:检测到 PInvoke 堆栈不平衡。

我认为我错误地调用了 DLL:

[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, Int64 lParam);

最佳答案

The error that comes is this one: PInvoke stack imbalance detected.

只需了解一下您所看到的背景,Ria 的回答就能解决您的问题。这实际上不是错误,它是由 MDA 生成的警告。托管调试助手,它是添加到 CLR、框架和调试器的额外代码,用于关注意外的运行时问题,并在您使用调试器运行时激活。您可以查看可用的 MDA,使用 Debug + Exceptions 并展开“Managed Debugging Assistants”节点以查看它们。默认情况下,它们中的很多都是禁用的,因为它们往往很嘈杂或倾向于生成错误警告或稍后已经生成异常。请注意,pInvokeStackImbalance MDA 实际上并未在此处列出,它很特殊,因为它无法关闭。

记录了 MDA 的完整列表 here . pInvokeStackImbalance 的描述包含对它检测到的问题原因的恰当描述:

The managed signature of the platform invoke call might not match the unmanaged signature of the method being called. This mismatch can be caused by the managed signature not declaring the correct number of parameters or not specifying the appropriate size for the parameters. The MDA can also activate because the calling convention, possibly specified by the DllImportAttribute attribute, does not match the unmanaged calling convention.

我强调了你案例中的真正原因,你的 lParam 参数类型错误。 wParam 类型也是错误的,但恰好具有正确的大小。当您的代码在 64 位操作系统上运行时,此类事故往往会发生。

虽然这只是一个警告,当您忽略它并继续运行时您的代码似乎运行得很好,但堆栈不平衡是一种非常严重的运行时问题。失败模式是不可预测的,它可能在调试版本中运行得很好,但在发布版本中用一个难以理解的异常轰炸你的程序。这里的具体问题是,当您调用该方法时,您将太多数据压入堆栈,而 Windows 无法从堆栈中弹出足够多的数据。当您经常调用它时,它可以用该站点的名称轰炸您的程序。问题往往是隐藏的,因为从 C# 方法返回会重新平衡堆栈。当在 Release模式下抖动优化器内联该方法时,所有的赌注都被取消了。只有当您没有附加调试器时它才会这样做,这是尝试诊断的最糟糕的错误。

找到正确的 pinvoke 声明并不是特别容易。声明它们的方法不止一种,您经常会发现有意对声明“撒谎”,以使函数更容易调用。 pinvoke.net 站点是一个相当不错的来源,尽管它倾向于过度指定声明。与 Ria 的示例一样,[return:] 属性是不必要的,因为它已经是 bool 的默认编码(marshal)处理。当您不拥有窗口句柄时,HandleRef 没有多大意义。但它会工作得很好。另一个相当不错的来源是 Pinvoke Interop Assistant,您可以使用该工具 find here .它生成自动生成的声明,它们并不漂亮。

最后但同样重要的是,您不能使用 PostMessage 将击键可靠地插入另一个进程的窗口。当您需要流程的键盘状态准确时,您会遇到麻烦,尤其是 Shift、Alt 和 Ctrl 键。像 Alt+Gr 这样的死键出现在不同布局的键盘上,特别是对于有很多变音符号或大字母表的语言。要戳打字键,您应该改用 WM_CHAR。

关于c# - 如何修复 "Pinvoke stack imbalance detected"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com