The MFC socket functions may fail and return an error when you call MFC socket functions from ExitInstance of a DLL (196836)



The information in this article applies to:

  • The Microsoft Foundation Classes (MFC), when used with:
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1
    • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
    • Microsoft Visual C++, 32-bit Professional Edition 4.2
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0

This article was previously published under Q196836

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.

Modification Type:MajorLast Reviewed:6/8/2005
Keywords:kbtshoot kbDLL kbprb kbWinsock KB196836 kbAudDeveloper