2012-06-01 2 views
2

Когда я запускаю этот код для GetWindowText я получаю следующее сообщение об ошибке брошенной внутреннем исключения:GetWindowText() бросает ошибку и не быть пойманной Try/уловом

{ "Попытка чтения или записи в защищенной памяти. Это часто указывает на то, что другая память повреждена "}

[DllImport("user32.dll", EntryPoint = "GetWindowTextLength", SetLastError = true)] 
    internal static extern int GetWindowTextLength(IntPtr hwnd); 

    [DllImport("user32.dll", EntryPoint = "GetWindowText", SetLastError = true)] 
    internal static extern int GetWindowText(IntPtr hwnd, ref StringBuilder wndTxt, int MaxCount); 

try{ 
     int strLength = NativeMethods.GetWindowTextLength(wndHandle); 
     var wndStr = new StringBuilder(strLength); 
     GetWindowText(wndHandle, ref wndStr, wndStr.Capacity); 
    } 
    catch(Exception e){ LogError(e) } 

у меня 2 вопроса:.

  1. Почему ошибка не поймана в попытке поймать?

  2. Любая идея, как я могу остановить программу сбой, когда она попадает этот тип ошибки, кроме использования TRY/поймать

Приветствия

+1

Не следует ловить (исключение e) быть уловом (исключение e)? – hatchet

+0

Это да, просто опечатка в вопросе. –

+1

Можете ли вы попробовать GetWindowTExt (wndHandle, wndStr, wndStr.Capacity)? Кроме того, возможно ли, что NativeMethods.GetWindowTextLength (wndHandle) - это то, что бросает исключение? – hatchet

ответ

8

1.

Есть некоторые исключения, которые не могут быть пойманы. Одним типом является StackOverflow или OutOfMemory, потому что буквально нет памяти для распределения для обработчика. Другой тип - один, который передается в CLR через ОС Windows. Этот механизм называется структурированной обработкой исключений. Эти исключения могут быть очень плохими, поскольку CLR не может быть уверенным в том, что его собственное внутреннее состояние является последовательным и иногда называется поврежденными исключениями. В .Net 4 управляемый код по умолчанию не обрабатывает эти исключения.

Вышеприведенное сообщение из AccessViolationException, которое является своего рода поврежденным исключением состояния. Это происходит потому, что вы вызываете неуправляемый метод, который записывается за конец буфера. См. Статью this о возможностях обработки этих исключений.

2.

ли образец кода here работу? Вам нужно убедиться, что неуправляемый код не записывается за конец буфера StringBuilder.

+0

Образец данных работает отлично. Не уверен, удалял ли он «ref» или добавлял 1 к длине, но теперь он отлично работает. Спасибо, Майк. –

2

Вполне возможно, что называть эти внешние методы вызывает проблемы, так как параметров, которые вы предоставляете GetWindowText. Я думаю, вы должны попробовать следующее:

try{ 
    int strLength = NativeMethods.GetWindowTextLength(wndHandle); 
    var wndStr = new StringBuilder(strLength + 1); 
    GetWindowText(wndHandle, wndStr, wndStr.Capacity); 
    } 
catch(Exception e){ LogError(e) }