代码之家  ›  专栏  ›  技术社区  ›  sharptooth

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

  •  1
  • sharptooth  · 技术社区  · 15 年前

    我有一个使用WinInet的VC++应用程序。它执行以下操作:

    • 电话 LoadLibrary()
    • 电话 InternetAttemptConnect()
    • 电话 InternetOpen()
    • InternetConnect() 提供 INTERNET_SERVICE_FTP 作为 dwService

    如果最后一次呼叫失败(通常是因为传递了错误的密码) Internet连接() 返回0,这应该通过将错误写入日志并退出应用程序来处理。

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

    在此之后,库卸载开始-要么是一个静态对象持有一个句柄wininet.dll被破坏了 FreeLibrary() 被称为或 免费图书馆() 由Windows调用。不管怎样 免费图书馆()

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

    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 回复  |  直到 9 年前