2

私のアプリケーションでは、同じプロセスのウィンドウのテキストを読んでいます。User32.dllのGetWindowTextを使用しています。しかし、メソッドを呼び出そうとすると、「タイプ'System.ExecutionEngineException'の未処理の例外がaaaa.exeで発生しました」という例外が発生します。正確なエラーはどこで確認できますか。そして、なぜ私はこの例外を受け取っているのですか。

私のコードは以下の通りです。

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

EnumDelegate enumfunc = new EnumDelegate(EnumWindowsProc);

private bool EnumWindowsProc(IntPtr win, int lParam)
{
    StringBuilder sb = new StringBuilder();
    GetWindowText(win, sb, 100);
    if (sb.Length > 0)
    {
        // do something
    }
}
4

1 に答える 1

7

GetWindowText() 呼び出しによってガベージ コレクション ヒープが破損したため、この例外が発生しています。StringBuilder の代わりに文字列を渡すか、StringBuilder の初期化を忘れた場合に簡単に実行できます。

正しい方法:

  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  private static extern bool GetWindowText(IntPtr hWnd, StringBuilder buffer, int buflen);
...
  var sb = new StringBuilder(666);
  if (GetWindowText(handle, sb, sb.Capacity)) {
    string txt = sb.ToString();
    //...
  }
于 2010-01-06T13:51:49.443 に答える