【问题标题】:Overflow Errors in 64-bit Windows Server 2012 after Upgrade to .NET Framework?升级到 .NET Framework 后 64 位 Windows Server 2012 中出现溢出错误?
【发布时间】:2015-03-05 14:44:07
【问题描述】:

我们的解决方案最近从 .NET Framework v3.5 升级到 v4.5.2,因此我们在 Windows Server 2012 64 位计算机上运行时遇到了一些溢出错误。

这些溢出错误似乎来自我们从 Windows API 调用此函数的任何实例:

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);

发生溢出是因为对于 lParam 在某些情况下,无论出于何种原因,它被传递一个 int 而不是一个 IntPtr,即使该函数需要一个 IntPtr。

有趣的是,这些问题仅在升级 .NET 后出现,并且仅在 Windows Server 2012 64 位机器上出现。

我试图破译仅在这些情况下发生这种情况的原因,并试图找到一种有效的方法来找到可能发生此类溢出错误的其他实例。

我的第一个想法是查找所有调用 SendMessage 的实例,但这可能会错过其他一些 IntPtr 被滥用的实例。我的另一个想法是使用 ReSharper 或 FXCop 来检测这类实例并提醒我注意它们,但我不知道这如何或是否可行,并且默认情况下 ReSharper 不会给出任何投诉。

【问题讨论】:

  • 很难说。您没有提供足够的代码。也没有错误信息。我们可以尝试猜测发生了什么,但实际上,有什么意义呢? wParam 应该是 IntPtr。是不是你的问题,谁能说。
  • @DavidHeffernan 你的意思是lParam 还是wParam?我不知道wParam 也应该是一个 IntPtr。在这种情况下,我认为代码示例不会真正有帮助,它只是 SendMessage(Some IntPtr, Some int, Some int, Some int); 在导致溢出的情况下。
  • 我的意思正是我所说的。 wParamlParam 都是指针大小的。这是有据可查的。如果您不想提供更多详细信息,如果您不想提供错误消息,那么祝您解决问题好运。

标签: .net winapi 64-bit dllimport windows-server-2012


【解决方案1】:

您应该使用IntPtr 而不是int,因为SendMessage 函数的最后两个参数是指针。有关 WPARAMLPARAM 类型的信息,请参阅 Windows Data Types

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

【讨论】:

  • 将此标记为正确答案,因为您链接的可能重复的问题有助于解决问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2017-10-08
  • 2013-07-22
相关资源
最近更新 更多