【问题标题】:C# A buffer overrun has occurredC# 发生缓冲区溢出
【发布时间】:2014-09-22 08:30:23
【问题描述】:
A buffer overrun has occurred in MyApp.exe which has corrupted the program's internal state.

我已经尝试了一些方法,但无法弄清楚是什么导致了 1/50 调用中出现上述情况,这可能是显而易见的,有很多猜测。

[DllImport("user32.dll")]
public static extern IntPtr GetTopWindow(IntPtr hWnd);

[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out UInt32 pid);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

public static IntPtr GetProcessWindow(int processId)
{
    UInt32 pid = 0;
    UInt32 dwThreadId = 0;
    StringBuilder a = new StringBuilder();
    IntPtr hwnd = GetTopWindow(IntPtr.Zero);

    while(hwnd != null)
    {
        dwThreadId = GetWindowThreadProcessId(hwnd, out pid);
        GetWindowText(hwnd, a, 256);
        String name = a.ToString();
        if(pid == processId && name.Contains("[Window Name]"))
            return hwnd;
        hwnd = GetWindow(hwnd, 2);
    }

    return IntPtr.Zero;
}

提前致谢。

【问题讨论】:

  • 错误在哪里? IE。哪条线?堆栈跟踪是什么?
  • 致任何阅读这篇文章的人:当您通过谷歌搜索错误消息时,这不太可能是您的问题。该错误会导致堆损坏,但错误消息几乎总是堆栈损坏问题。

标签: c# c++ dllimport


【解决方案1】:

您没有在StringBuilder 中预先分配缓冲区。

这一行:

StringBuilder a = new StringBuilder();

应该是:

StringBuilder a = new StringBuilder(256);

【讨论】:

  • +1 在MSDN中有明确说明:唯一需要注意的是StringBuilder必须为返回值分配足够的空间,否则文本会溢出,导致异常由 P/Invoke 抛出。 这意味着 OP 的代码只有在文本小于默认 StringBuilder 容量(这是特定于实现的,但目前在 .NET 4.5 IIRC 中为 16)时才应该工作。
【解决方案2】:

尝试使用GetWindowTextLength API 调用定义的容量初始化StringBuilder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2015-12-16
    相关资源
    最近更新 更多