У меня есть приложение 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 не был завершен должным образом, и для его решения требуются дополнительные действия и время.
Есть ли обходной путь для этой ситуации?