65.9K
CodeProject is changing. Read more.
Home

Accessing Windows 2000 specific APIs

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (9 votes)

Feb 29, 2000

viewsIcon

101111

Having trouble accessing the new Windows 2000 APIs? This article may help.

In order to access Win2000 specific APIs etc, one needs the following #define in the application's stdafx.h (before any other #includes)

#define _WIN32_WINNT 0x0500
With the latest platform SDK, this also has the side effect of changing the definition for the OPENFILENAME struct; in particular it makes it larger. This is because of the following lines in the "CommDlg.h"
typedef struct tagOFNA {
	DWORD        lStructSize;
	...
	...
	LPCSTR       lpTemplateName;
#ifdef _MAC
	LPEDITMENU   lpEditInfo;
	LPCSTR       lpstrPrompt;
#endif
#if (_WIN32_WINNT >= 0x0500)
	void *       pvReserved;
	DWORD        dwReserved;
	DWORD        FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAMEA, *LPOPENFILENAMEA;

This means when the definition of class CFileDialog is compiled, it's m_ofn member will have a different size than in the MFC dlls. This is because CFileDialog is defined as:

class CFileDialog : public CCommonDialog
{
	DECLARE_DYNAMIC(CFileDialog)
	public:
	// Attributes
	OPENFILENAME m_ofn; // open file parameter block
	...
	...
};

When a CFileDialog is used in your code and is destructed, the wrong offsets into memory for member varialbes will be unsed, and in particular, the m_strFilter will not destruct properly.

The work-around for this is to #undef _WIN32_WINNT before the #include <afxext.h> in the application's stdafx.h:

#define _WIN32_WINNT 0x0500     // allow Win2000 specific calls
#define VC_EXTRALEAN            // Exclude rarely-used stuff from Windows headers
#include <afxwin.h>             // MFC core and standard components
#undef _WIN32_WINNT             // allow CFileDialog to build with the correct size
#include <afxext.h>             // MFC extensions
#include <afxdtctl.h>           // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

Now, <afxext.h> will (indrectly) #include <CommDlg.h> and define CFileDIalog all without the offending _WIN32_WINNT.

NOTE: This only works because the VC_EXTRALEAN stops <afxwin.h> from including CommDlg.h earlier.