Приложение зависает или вылетает при выгрузке WinInet - PullRequest
1 голос
/ 10 августа 2009

У меня есть приложение VC ++, которое использует WinInet. Это делает следующее:

  • вызывает LoadLibrary() для загрузки WinInet.dll
  • звонки InternetAttemptConnect()
  • звонки InternetOpen()
  • звонки InternetConnect(), предоставление INTERNET_SERVICE_FTP как dwService

Если последний вызов не удался (обычно из-за неправильного пароля) InternetConnect() возвращает 0, и это должно быть обработано путем записи ошибки в журнал и выхода из приложения.

Когда это происходит, приложение вызывает InternetCloseHandle() для закрытия дескриптора, возвращенного InternetOpen(), и оставляет WinMain().

После этого начинается выгрузка библиотек - либо статический объект, содержащий дескриптор wininet.dll, уничтожается и вызывается FreeLibrary(), либо Windows вызывается FreeLibrary(). В любом случае звонок на FreeLibrary() либо зависает, либо вылетает.

Обычно зависает со следующим стеком вызовов:

ntdll.dll!KiFastSystemCallRet()     
ntdll.dll!NtWaitForSingleObject()  + 0xc    
kernel32.dll!WaitForSingleObject()  + 0x12  
wininet.dll!InternetInitializeAutoProxyDll()  + 0xe3    
wininet.dll!InternetInitializeAutoProxyDll()  + 0x193e  
wininet.dll!771b159d()  
ntdll.dll!LdrInitializeThunk()  + 0x24  
ntdll.dll!LdrDisableThreadCalloutsForDll()  + 0x949 
kernel32.dll!FreeLibrary()  + 0x19  
MyApp.exe!$E5()  + 0x10 C++ <-presumably the static object destructor call
msvcr71.dll!doexit(int code=0, int quick=0, int retcaller=0)  Line 376  C
msvcr71.dll!exit(int code=0)  Line 303 + 0xd    C
MyApp.exe!wWinMainCRTStartup()  Line 406    C <-entry point of my application
kernel32.dll!RegisterWaitForInputIdle()  + 0x49 

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

Есть ли обходной путь для этой ситуации?

...