C++ 卸载WinInet时应用程序挂起或崩溃
我有一个使用WinInet的VC++应用程序。它做了以下工作: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.dllLoadLibrary()
- 调用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的总结将是回答您问题的好线索。