C # WebBrowser Control System. Доступность доступа - PullRequest
30 голосов
/ 07 октября 2008

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

System.AccessViolationException

FullText = System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)

Есть ли у кого-нибудь какие-либо подсказки относительно того, почему я получил бы это и как предотвратить это?

Ответы [ 8 ]

6 голосов
/ 07 марта 2011

У нас недавно была похожая проблема на машинах нескольких клиентов. Проблема оказалась ошибкой в ​​элементе управления MSHTML в определенных средах. Обычным симптомом этой проблемы, кажется, является нарушение регистрации библиотеки jscript.dll.

Симптомы, которые могут помочь диагностировать, если это та же проблема - jscript.dll не указан в модулях отладчика и не загружается процессом; Собственная трассировка стека для сбоя следующая:

mshtml!CRootTracker::CollectGarbageInternal+0xd
mshtml!CDoc::ReduceMemoryPressureTask+0x29
mshtml!CStackPtrAry<unsigned long,12>::GetStackSize+0xb6
mshtml!GlobalWndProc+0x183
USER32!InternalCallWinProc+0x23
USER32!UserCallWinProcCheckWow+0x109
USER32!DispatchMessageWorker+0x3bc
USER32!DispatchMessageW+0xf

Решение состоит в том, чтобы заново зарегистрировать библиотеку jscript.dll, и сбой должен исчезнуть.

Перерегистрация библиотеки выполняется следующим образом (пример приведен для 64-битной Windows, в противном случае требуется только первая строка):

C:\Windows\System32\regsvr32.exe C:\Windows\System32\jscript.dll
C:\Windows\SysWOW64\regsvr32.exe C:\Windows\SysWOW64\jscript.dll

Обе команды должны быть «Запуск от имени администратора».

4 голосов
/ 04 июля 2011

Я сталкивался с этим исключением несколько раз при попытке доступа к WebBrowser.ReadyState и WebBrowser.Document.

У меня были исключения исключительно для Windows XP 32bit. После того, как другие решения не помогли, возникла проблема с многопоточностью. Я окружил все блоки кода, которые обращались к элементу управления веб-браузера, блокировками мьютекса, и это, казалось, решило проблему.

3 голосов
/ 07 октября 2008

Мне кажется, что вы пытаетесь манипулировать документом до того, как перейдете к нему. Попробуйте перейти к «about: blank» перед изменением текста документа или html.

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

1 голос
/ 09 октября 2008

Мы тоже находимся на этом. Непоследовательно, мы получим это исключение.

Некоторые вопросы, которые помогут сузить эту проблему: используете ли вы напрямую интерфейсы mshtml (например, mshtml.dll)? Делает ли COM-взаимодействие напрямую?

Мы обнаружили, что неправильный вызов некоторых интерфейсов COM MSHTML может вызвать это.

Мы также обнаружили, что неправильное выполнение COM-маршалинга может вызвать это.

Если в импорте интерфейса MSHTML есть ошибка, которую использует встроенный WebBrowser, это может привести к этому.

Доступ к документу IFRAME Elements из другого домена может вызвать это.

Вполне возможно, что выполнение вызовов WebBrowser, когда документ еще не готов, также может вызывать это.

0 голосов
/ 17 декабря 2009

Это, похоже, проблема с Vista, что мне случилось из-за того, что мой C # webBrowser1 открывает веб-страницу с запущенным Java-апплетом, который открывает внешнюю веб-страницу IE, на которой выполняется приложение / скрипт ActiveX.

Когда скрипт ActiveX пытается обновить обратно в память приложения C #, DEP «Предотвращение выполнения данных» в Vista помечает эту операцию как враждебную / вирусную и завершает программу с System.AccessViolationException: попытка чтения или записи защищенная память. Это часто указывает на то, что другая память повреждена. "

Мое исправление для этого состояло в том, чтобы включить DEP в Vista с этой строкой в ​​cmd

"bcdedit.exe /set {current} nx AlwaysOff"

и перезагрузите машину.

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

Щелкните правой кнопкой мыши на «Мой компьютер» Выберите «Свойства» и «Дополнительно» Под «Запуск и восстановление, нажмите Настройки Теперь нажмите «Изменить» Блокнот только начался. Просто замените строку: Код: опция noexecute от AlwaysOff Перезагрузите компьютер, чтобы завершить транзакцию.

Если вы хотите повторно активировать DEP, достаточно провести обратное, например:

Заменить на Цитата: AlwaysOff noexecute = noexecute = optin

0 голосов
/ 13 марта 2009

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

0 голосов
/ 11 октября 2008

Есть ли на страницах, на которые вы переходите, какие-либо элементы управления ActiveX? Если да, один из них может быть ошибочным. Также проверьте свои страницы в IE. Посмотрите, не разбиваются ли они так же. Это поможет определить, относится ли оно к контенту или элементу управления браузера.

0 голосов
/ 10 октября 2008

Просто предложение, я не эксперт в этом, но я много использовал WebBrowser в предыдущих приложениях, но почему бы вам не написать функцию, которая должна подождать 1 секунду, прежде чем пытаться что-то пропустить в браузере, и всегда заранее проверять состояние готовности , Можно немного замедлить его, но это должно сделать его пуленепробиваемым. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...