InternetSetOption тупик? - PullRequest
       8

InternetSetOption тупик?

0 голосов
/ 20 июля 2010

У меня есть приложение, которое использует элемент управления Webbrowser для перехода на несколько сайтов поставщиков и очистки отчетов. Поскольку у одного поставщика есть несколько учетных записей, мне нужно, чтобы браузер завершил сеанс и удалил все установленные куки. Я использую вызовы API для wininet.dll для обоих и могу достичь желаемого результата. Однако время от времени я получаю то, что кажется тупиковым в InternetSetOption для INTERNET_OPTION_END_BROWSER_SESSION.

Это очень линейный код, и InternetSetOption вызывается из одного потока в одном месте. Трудно понять, что, работая в режиме отладки, я очень редко смог воспроизвести проблему. Как только я компилирую и запускаю за пределами VS, это произойдет вскоре после этого. Я изолировал это от того, что качал сообщения на консоль во время работы.

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

Кто-нибудь может сказать, что я могу сделать для отладки?

Объявлен как:

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool InternetSetOption(
    IntPtr hInternet,
    int dwOption,
    IntPtr lpBuffer,
    int lpdwBufferLength);

И вызывается по:

InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0);

1 Ответ

2 голосов
/ 27 июля 2010

Для всех, кто сталкивался с этим и, случайно, имеет ту же проблему - проблема, кажется, вызвана функцией, которую я нашел на сайте MSDN для очистки кэша и файлов cookie. найдено здесь .

В этой функции ClearCache () было несколько проблем, одна из которых была между x86 и x64 и как она ссылалась на файлы кэша для их удаления -

Inтекущая функция, она вызывает DeleteUrlCacheEntry следующим образом:

DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);

Однако в x64 это должно быть

DeleteUrlCacheEntry(internetCacheEntry.lpszLocalFileName);

Вы должны переключаться между теми, которые основаны на платформе, одна ссылка не делаетработать на x64 и x86.Спорный вопрос для меня, однако.Эта функция часто генерирует исключения Access Violation, и даже когда я ее поймаю и обработаю, я считаю, что это был корень InternetSetOption, выполняющий то, что казалось тупиком.Опять же, мне никогда не удавалось тщательно его снять из-за странной природы тупика, для меня я использовал и эту функцию ClearCache () И InternetSetOption.Изменение последовательности двух вызовов функций не привело к ее исправлению.

Я удалил класс WebBrowserHelper и вернулся к очистке кэша и файлов cookie, выполнив RunDLL32 и дождавшись завершения этого процесса.

Надеюсь, это кому-нибудь поможет!

...