2014-11-20 2 views
0

У меня есть список оконных дескрипторов, и для каждого из них нужно оценить, относится ли это к MS Excel или нет. Я написал небольшую функцию isExcel для этой цели.Ошибка GetClassName в определенном приложении (Lync)

private bool isExcel(IntPtr wHdl){ 
     bool f = false; 
     StringBuilder lpClassName = new StringBuilder(); 
     GetClassName(wHdl, lpClassName, 100); 
     f = ((lpClassName.ToString() == "MS-SDIb") || (lpClassName.ToString() == "XLMAIN")); 
     return f; 
    } 

Это прекрасно работает ... за исключением некоторых случаев. MS Lync и MS SQL Server Management Studio 2012

Когда дескриптор окна, связанный с этими приложениями, попадает в указанную выше процедуру, он не просто терпит неудачу, но и отключает мое приложение. Неисправный линии и, таким образом, допустить ошибку, как:

GetClassName (wHdl, lpClassName, 100);

"vshost32.exe перестал работать"

И тогда мое приложение закрывается.

Я, очевидно, обойдусь этими проблемами и обход вокруг процедуры isExcel для этого дескриптора конкретного приложения; но я бы скорее решил проблемы, а затем обойти их.

Любое понимание этой проблемы, почему это происходит и как с ней справиться .... было бы весьма полезно.

Thanks

+1

Вы забыли установить Capacity StringBuilder, это не 100, как вы и обещали. Повреждение кучи вызывает очень случайное поведение при сбоях. –

+0

Спасибо, Ганс .. я сейчас чувствую себя глупо! – Esby

ответ

1

У меня есть аналогичная проблема. Я исправлю это, используя другой конструктор StringBuilder: StringBuilder lpClassName = new StringBuilder("",256);