我有一个使用WinInet的VC ++应用程序。它执行以下操作:
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还没有正确定稿,处理这个需要一些额外的动作和时间。
这种情况有解决方法吗?