FIX: MFC Sockets Application Causes GP Fault on ExitID: Q130653
|
An MFC application that uses MFC's socket classes (CSocket and CAsyncSocket) and statically links with MFC causes a general protection (GP) fault on exit. The GP fault occurs on the following line in SOCKCORE.CPP:
SOCKCORE.CPP(32):
if (_afxSockState->lpfnSockCleanup != NULL)
This error occurs if the application contains a call to AfxSocketInit but
for some reason terminates without ever actually calling that function. It
will also occur if the call to AfxSocketInit fails.
The MFC socket implementation maintains a static pointer to a structure that maintains socket state information. This variable is defined in SOCKCORE.CPP as:
static AFX_SOCKSTATE* _afxSockState;
_afxSockState is initialized when an application calls AfxSocketInit.
However if an application does not call AfxSocketInit or the call to
AfxSocketInit fails, the variable is not initialized, and the 'if'
statement shown above attempts to remove the reference to a NULL pointer,
which causes the GP fault.
"Writing An Application that Uses the DLL Version"NOTE: In order to use the DLL version of MFC with a sockets app, you also need to link with MFCN250(D), which contains the definitions for the CSocket and CAsyncSocket members.
if (_afxSockState->lpfnSockCleanup != NULL)
To this line:
if((_afxSockState!=NULL) && (_afxSockState->lpfnSockCleanup!=NULL))
Once the change has been made, you can rebuild the MFC static library to
incorporate the change. For details on how to rebuild the MFC static
library, please see the README.TXT file in the MFC\SRC directory and
Appendix B of the Class Library User's Guide.Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in MFC version 2.53 included with Microsoft Visual C++ version 1.52b for Windows.
Additional query words: 1.52 2.52 GPF
Keywords : kb16bitonly kbMFC kbVC kbWinsock
Version : 1.52
Platform : WINDOWS
Issue type :
Last Reviewed: August 2, 1999