卸载WinInet时应用程序挂起或崩溃

时间:2009-08-10 06:50:42

标签: c++ windows visual-c++ wininet

我有一个使用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还没有正确定稿,处理这个需要一些额外的动作和时间。

这种情况有解决方法吗?

0 个答案:

没有答案