PRB: MFC Socket Functions Fail from ExitInstance

ID: Q196836


The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), included with:
    • Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1, 4.2, 5.0, 6.0


SYMPTOMS

When you call MFC socket functions from ExitInstance of a DLL, the functions may fail and return an error.


CAUSE

In an MFC DLL, the CWinApp::ExitInstance function is called from the DllMain function in response to the DLL_PROCESS_DETACH case.

The MFC socket functions call the WinSock APIs implemented in wsock32.dll. When an application shuts down, the DllMain with DLL_PROCESS_DETACH of the WinSock DLL may be called before the DllMain of the MFC regular DLL. This can cause some process specific information to be lost.

NOTE: This problem applies to non-MFC DLLs and non-MFC sockets as well.


RESOLUTION

Do not call socket functions from CWinApp::ExitInstance (DLL_PROCESS_DETACH). Provide a cleanup function that the application can call to perform the last socket functions.


STATUS

This behavior is by design.


MORE INFORMATION

A common mistake is to call the CSocket::Close (or CAsyncSocket::Close) function in CWinApp::ExitInstance. This can generate an assertion in sockcore.cpp line 856 in Microsoft Visual C++ 5.0, and line 667 in Microsoft Visual C++ 6.0.

(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Adam Kim, Microsoft Corporation.

Additional query words:

Keywords : kbDLL kbMFC kbVC400 kbVC410 kbVC420 kbVC500 kbVC600 kbWinsock
Version : WINNT:4.0,4.1,4.2,5.0,6.0
Platform : winnt
Issue type : kbprb


Last Reviewed: July 26, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.