Published by orzz.org(). (http://orzz.org/%e5%9c%a8win32%e5%b7%a5%e7%a8%8b%e4%b8%ad%e4%bd%bf%e7%94%a8gdiplus/)
在vs直接建立的win32工程里直接添加GdiPlus的相关支持文件:
1 2 3 |
#include <gidplus.h> using namespace gdiplus; #pragma comment(lib, "gdiplus.lib") |
编译器会报几百个错误,都是些什么"缺少类型说明符",语法错误或者标识符错误之类,一般这种情况都是由于头文件引用缺少一些特殊的支持,或者引用顺序错误导致的.
网上的解决办法一般有两种:
- 关闭#include <windows.h>前面的WIN32_LEAN_AND_MEAN定义;
- 在导入GdiPlus支持文件之前添加#include <comdef.h>.
这两种解决办法究竟有什么不同呢?
我们参考windows.h的文件内容,中间关于WIN32_LEAN_AND_MEAN宏定义的部分是这样写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#ifndef WIN32_LEAN_AND_MEAN #include <cderr.h> #include <dde.h> #include <ddeml.h> #include <dlgs.h> #ifndef _MAC #include <lzexpand.h> #include <mmsystem.h> #include <nb30.h> #include <rpc.h> #endif #include <shellapi.h> #ifndef _MAC #include <winperf.h> #include <winsock.h> #endif #ifndef NOCRYPT #include <wincrypt.h> #include <winefs.h> #include <winscard.h> #endif #ifndef NOGDI #ifndef _MAC #include <winspool.h> #ifdef INC_OLE1 #include <ole.h> #else #include <ole2.h> #endif /* !INC_OLE1 */ #endif /* !MAC */ #include <commdlg.h> #endif /* !NOGDI */ #endif /* WIN32_LEAN_AND_MEAN */ |
中间并没有关于comdef.h的内容.
不过我们打开comdef.h查看内容,发现里面引用了ole2.h这个头文件,而关闭WIN32_LEAN_AND_MEAN宏之后的windows.h也引用了这个头文件.
于是我仅在GdiPlus支持文件之前添加#include <ole2.h>,代码编译成功.
打开ole2.h,可以发现里面引用了objbase.h.
实际上直接在GdiPlus支持文件之前添加#include <objbase.h>,编译就不会出错了.
关于objbase.h,微软的注释是:"Component object model defintions",意思貌似是COM组件模型的基础定义.
不过其实这个头文件也不是最终需要的文件...
只要添加了objbase.h中引用的rpc.h,urlmon.h或propidl.h中的任意一个头文件,GdiPlus编译就不会再出错.
urlmon.h和propidl.h引用了rpc.h与ole2.h,因此最终的头文件应该还是rpc.h.可rpc.h中真正起作用的部分是哪里呢?
打开rpc.h,就会发现其中有一段代码:
1 2 3 |
#if !defined( RPC_NO_WINDOWS_H ) && !defined( MAC ) && !defined( _MAC ) && !defined(_KRPCENV_) #include <windows.h> #endif // RPC_NO_WINDOWS_H |
测试一下就会发现,这段代码才是真正起作用的代码=.=
很好,绕了一圈绕回来了...
也许真正让GdiPlus通过的代码就隐藏在那一堆头文件的内容里,又或者只有MS知道在哪里...反正我是不想再深究了,呵呵