PRB: MFC Sockets Application Crashes after Exit on NT 3.51

ID: Q161871


The information in this article applies to:
  • Microsoft Visual C++, 32-bit Editions, versions 4.1, 4.2


SYMPTOMS

When you unload an application or DLL that uses the MFC socket classes, an Unhandled Access violation occurs. This only happens on Windows NT 3.50 or 3.51 and will often be erratic in its occurrence; it does not reproduce consistently.


CAUSE

A bug in the WSOCK32.DLL that is included with Windows NT 3.5x can cause this behavior. The bug occurs when the DLL is being unloaded via FreeLibrary.

As of MFC version 4.1, the sockets classes explicitly load the WINSOCK DLL rather than implicitly loading the DLL. Consequently, the socket classes may encounter this bug when FreeLibrary is called to unload the DLL.


RESOLUTION

The only resolution is to prevent WSOCK32.DLL from being completely unloaded when MFC makes the call to FreeLibrary. This can only be done by increasing the DLL's module usage count.

The effect of this will be an increased memory footprint for the process that is using the socket classes. If it is a DLL that is using the MFC socket classes, then the WSOCK32.DLL will remain loaded in the process memory space even after the MFC DLL is unloaded.

However, as long as the DLL is not being used or accessed, this memory will be swapped out to disk and should not have a major impact on performance.

To implement the following workaround, modify your code to make an additional call to LoadLibrary after the call to AfxSocketInit(). Because the problem only occurs on Windows NT 3.5x, you don't need to include the additional call to LoadLibrary for Windows 95 or Windows NT 4.0. This can be determined using the GetVersion() API call.

For example:


   BOOL CMyApp::InitInstance()
   {
     ...
     if(!AfxSocketInit())
     {
           AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
           return FALSE;
     }
     DWORD dwVersion = ::GetVersion();
     BOOL bWin4 = (BYTE)dwVersion >= 4;
     if(!bWin4 && !LoadLibrary("WSOCK32.DLL"))
     {
           AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
           return FALSE;
     }
     ... 

Additional query words: 4.10 4.20 kbdsd

Keywords : kbMFC kbVC kbWinsock
Version : 4.10 4.20
Platform : NT WINDOWS
Issue type :


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