|
|
@@ -0,0 +1,80 @@
|
|
|
+//// 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")
|