PRB: Problems Occur When Defining _AFX_NO_XXX

This article was previously published under Q140751
This article has been archived. It is offered "as is" and will no longer be updated.
SYMPTOMS
The _AFX_NO_XXX macros are not intended to be defined or undefined by usersof MFC. These macros exist only for the purpose of checking whether aparticular target platform supports that feature or not. You can write yourprogram to check these macros (for example, #ifndef _AFX_NO_OLE_SUPPORT),but your program should never define or undefine these macros.

If you define _AFX_NO_OLE_SUPPORT, the symptoms might include:

  • Application encounters Access Violation on start-up.
  • InitInstance is not called in a DLL.
Other macros that you should not define include:

_AFX_NO_AFXCMN_SUPPORT
_AFX_NO_CTL3D_RESOURCES
_AFX_NO_DAO_SUPPORT
_AFX_NO_DB_SUPPORT
_AFX_NO_MAPI_RESOURCES
_AFX_NO_NESTED_DERIVATION
_AFX_NO_OCC_SUPPORT
_AFX_NO_OCX_SUPPORT
_AFX_NO_OLE_SUPPORT
_AFX_NO_RICHEDIT_SUPPORT
_AFX_NO_SOCKET_SUPPORT
_AFX_NO_SPLITTER_RESOURCES
_AFX_NO_SYNC_SUPPORT
_AFX_NO_TRACKER_RESOURCES
CAUSE
If you define or undefine any of these macros differently from the way MFCdefines them, then your application's compile will be based on a differentdefinition of MFC than the pre-compiled MFC library.

One example of how these macros are used by MFC can be found in AfxWin.h.CCmdTarget has the following section of code in its declaration:
class CCmdTarget : public CObject{...#ifndef _AFX_NO_OLE_SUPPORT  // called before dispatching to an automation handler function  virtual BOOL IsInvokeAllowed(DISPID dispid);#endif...};				
If _AFX_NO_OLE_SUPPORT is defined in your project, then the declaration ofCCmdTarget will not include this virtual function. However, the compiledversion of CCmdTarget in the MFC library does contain this function. Thiswill result in a v-table mismatch between your code and MFC's code.
RESOLUTION
Don't define or undefine these macros in your own code. They are intendedto be tested only. For example, for maximum future portability, if MFC wereto eventually target a platform that did not contain OLE support, then youcould use _AFX_NO_OLE_SUPPORT as follows:
#ifndef _AFX_NO_OLE_SUPPORT  DoSomeOLEStuff();#endif				
A common place to try to use these macros might be in your pre-compiledheader file (for example, StdAfx.h). In this case, you don't need to definethese symbols to prevent the including of unneccessary header files, youcan simply remove the #include lines.
STATUS
This behavior is by design.
4.00
Properties

Article ID: 140751 - Last Review: 09/27/2013 22:09:39 - Revision: 2.1

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbarchitecture kbprb KB140751
Feedback