1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- //// Ensure that GdiPlus header files work properly with MFC DEBUG_NEW and STL header files.
- /*
- PRB: Microsoft Foundation Classes DEBUG_NEW Does Not Work with GDI+
- SYMPTOMS:
- When you build a debug version of a Microsoft Foundation Classes (MFC) application that uses GDI+,
- you may receive an error message that resembles the following:
- error C2660: 'Gdiplus::GdiplusBase::operator new' : function does not take 3 parameters
- CAUSE:
- In debug builds, MFC defines a preprocessor macro that expands the new operator to an overloaded new operator
- that takes two extra parameters. The extra parameters are the source file name and code line number.
- MFC can use this information to report memory leaks to the programmer when in debug mode.
- This works for MFC classes because MFC provides overloads for new that accept the extra parameters.
- However, because this expansion is done by the preprocessor, it affects all usage of the new operator.
- If any non-MFC classes are used in the project, their new operator is also expanded, even if no suitable overload
- of new is available in that class. This is what happens in GDI+, and as a result, you receive a compile-time error message.
- */
- #pragma once
- #define iterator _iterator
-
- #ifdef _DEBUG
-
- namespace Gdiplus
- {
- namespace DllExports
- {
- #include "GdiplusMem.h"
- };
-
- #ifndef _GDIPLUSBASE_H
- #define _GDIPLUSBASE_H
- class GdiplusBase
- {
- public:
- void (operator delete)(void* in_pVoid)
- {
- DllExports::GdipFree(in_pVoid);
- }
-
- void* (operator new)(size_t in_size)
- {
- return DllExports::GdipAlloc(in_size);
- }
-
- void (operator delete[])(void* in_pVoid)
- {
- DllExports::GdipFree(in_pVoid);
- }
-
- void* (operator new[])(size_t in_size)
- {
- return DllExports::GdipAlloc(in_size);
- }
-
- void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)
- {
- return DllExports::GdipAlloc(nSize);
- }
-
- void operator delete(void* p, LPCSTR lpszFileName, int nLine)
- {
- DllExports::GdipFree(p);
- }
-
- };
- #endif // #ifndef _GDIPLUSBASE_H
- }
- #endif // #ifdef _DEBUG
-
- #include "gdiplus.h"
-
- #undef iterator
-
- //// Ensure that Gdiplus.lib is linked.
- #pragma comment(lib, "gdiplus.lib")
|