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

C++ 卸载WinInet时应用程序挂起或崩溃,c++,windows,visual-c++,wininet,C++,Windows,Visual C++,Wininet,我有一个使用WinInet的VC++应用程序。它做了以下工作: 调用LoadLibrary()加载WinInet.dll 调用InternetAttemptConnect() 调用InternetOpen() 调用InternetConnect()作为dwService 如果最后一次调用失败(通常是因为传递了错误的密码)InternetConnect()返回0,应通过将错误写入日志并退出应用程序来处理 当这种情况发生时,应用程序调用InternetCloseHandle()关闭Interne

我有一个使用WinInet的VC++应用程序。它做了以下工作:

  • 调用
    LoadLibrary()
    加载WinInet.dll
  • 调用InternetAttemptConnect()
  • 调用InternetOpen()
  • 调用
    InternetConnect()
    作为
    dwService
如果最后一次调用失败(通常是因为传递了错误的密码)
InternetConnect()
返回0,应通过将错误写入日志并退出应用程序来处理

当这种情况发生时,应用程序调用
InternetCloseHandle()
关闭
InternetOpen()
返回的句柄,并离开
WinMain()

在此之后,库卸载开始-保存wininet.dll句柄的静态对象被销毁并调用
freebrary()
,或者Windows调用
freebrary()
。在任何情况下,对
freebrary()
的调用都会挂起或崩溃

通常,它与以下调用堆栈挂起:

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 
ntdll.dll!KiFastSystemCallRet()
ntdll.dll!NtWaitForSingleObject()+0xc
内核32.dll!WaitForSingleObject()+0x12
wininet.dll!InternetInitializeAutoProxyDll()+0xe3
wininet.dll!InternetInitializeAutoProxyDll()+0x193e
wininet.dll!771b159d()
ntdll.dll!LdriInitializeThunk()+0x24
ntdll.dll!LdrDisableThreadCalloutsForDll()+0x949
内核32.dll!FreeLibrary()+0x19

MyApp.exe$E5()+0x10C++时,只有当网络连接()返回0时,它才会崩溃,对吗?在成功的情况下,它不会崩溃。是否显式使用LoadLibrary()和GetProcAddress()?如果是这样,请确保正确声明了函数指针——提供执行GetProcAddress()和强制转换的代码。我还没有彻底测试InternetConnect()成功时它是否平稳停止。是的,Loadlibrary()和GetProcAddress()是显式使用的,指针声明是正确的,否则每隔一段时间就会崩溃一次。您可以制作一组最小的代码来演示这一点吗?崩溃还是挂起?对于崩溃,它们是否与挂起的堆栈相同?WinDBG的总结将是回答您问题的好线索。