在SDK中使用GDI+出现的编译问题解决方法

  • 2015-08-03
  • 938℃
Share:

问题描述:

在MFC中使用GDI+,编译时不会出现什么大的问题,但是SDK中却会报告很多未定义的类型,其中主要是和COM有关的声明.

首先要知道,GDI+是操作系统提供的模块,不和特定的编程语言和库相关联,所以纯净的SDK中是肯定可以使用GDI+的

其次,使用GDI+需要的头文件为GdiPlus.h,对应的lib文件为gdiplus.lib,GDI+被声明进Gdiplus命名空间中,GDI+库需要使用GdiplusStartup进行初始化,使用GdiplusShutdown进行清理(类似socket)。

如果在SDK中使用GDI+的话,做完上述操作之后进行编译,会报告类似如下的编译错误:

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2440: “初始化”: 无法从“const char [37]”转换为“int”

1>        没有使该转换得以执行的上下文

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2146: 语法错误 : 缺少“;”(在标识符“IImageBytes”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2470: “IImageBytes”: 看起来像函数定义,但没有参数列表;跳过明显的函数体

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C2059: 语法错误 : “public”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(280) : error C2146: 语法错误 : 缺少“;”(在标识符“id”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(280) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(280) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(384) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(395) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(405) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(443) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(444) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(445) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(453) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(471) : error C2535: “Gdiplus::Image::Image(void)”: 已经定义或声明成员函数

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(384) : 参见“Gdiplus::Image::Image”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(505) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(516) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(758) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(813) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(813) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(758) : 参见“Gdiplus::Metafile::Metafile”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(820) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(820) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(758) : 参见“Gdiplus::Metafile::Metafile”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(829) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(829) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(758) : 参见“Gdiplus::Metafile::Metafile”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(855) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(923) : error C2535: “Gdiplus::Metafile::Metafile(void)”: 已经定义或声明成员函数

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusheaders.h(758) : 参见“Gdiplus::Metafile::Metafile”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1133) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1133) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1133) : error C2065: “image”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1133) : error C2275: “Gdiplus::GpImage”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusgpstubs.h(61) : 参见“Gdiplus::GpImage”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1133) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1133) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1139) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1139) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1139) : error C2065: “image”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1139) : error C2275: “Gdiplus::GpImage”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusgpstubs.h(61) : 参见“Gdiplus::GpImage”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1139) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1139) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1156) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1244) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1247) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1250) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1262) : error C2061: 语法错误 : 标识符“PROPID”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1286) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1286) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1286) : error C2065: “bitmap”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1286) : error C2275: “Gdiplus::GpBitmap”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusgpstubs.h(62) : 参见“Gdiplus::GpBitmap”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1286) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1286) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1292) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1292) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1292) : error C2065: “bitmap”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1292) : error C2275: “Gdiplus::GpBitmap”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusgpstubs.h(62) : 参见“Gdiplus::GpBitmap”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1292) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(1292) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2222) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2222) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2224) : error C2065: “header”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2224) : error C2275: “Gdiplus::MetafileHeader”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetaheader.h(112) : 参见“Gdiplus::MetafileHeader”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2224) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2224) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2242) : error C2061: 语法错误 : 标识符“IStream”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2262) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2262) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2262) : error C2065: “metafile”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2262) : error C2275: “Gdiplus::GpMetafile”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusgpstubs.h(63) : 参见“Gdiplus::GpMetafile”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2262) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2262) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2309) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2309) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2310) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2310) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2310) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2310) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2310) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2316) : error C2059: 语法错误 : “)”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2320) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2320) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2321) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2321) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2321) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2321) : error C2078: 初始值设定项太多

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2321) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusflat.h(2327) : error C2059: 语法错误 : “)”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdipluspath.h(133) : error C2061: 语法错误 : 标识符“byte”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(75) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(75) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(76) : error C2448: “Gdiplus::Metafile::{ctor}”: 函数样式初始值设定项类似函数定义

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(194) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(194) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(195) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(195) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(195) : error C2761: “{ctor}”: 不允许成员函数重新声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(198) : error C2059: 语法错误 : “)”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(199) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(199) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(211) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(211) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(212) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(212) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(212) : error C2761: “{ctor}”: 不允许成员函数重新声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(217) : error C2059: 语法错误 : “)”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(218) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(218) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(230) : error C2065: “IStream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(230) : error C2065: “stream”: 未声明的标识符

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(231) : error C2275: “HDC”: 将此类型用作表达式非法

1>        c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(267) : 参见“HDC”的声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(231) : error C2146: 语法错误 : 缺少“)”(在标识符“referenceHdc”的前面)

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(231) : error C2761: “{ctor}”: 不允许成员函数重新声明

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(236) : error C2059: 语法错误 : “)”

1>c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusmetafile.h(236) : fatal error C1003: 错误计数超过 100;正在停止编译


解决方法:

上述需要的声明信息,在windows.h和comdef.h两个头文件中,一般使用SDK写程序都要添加windows.h头文件,其实windows.h中是含有comdef.h的声明的。

但是如果你使用的IDE太智能了(比如我用的VC2008),在stdafx.h中会创建WIN32_LEAN_AND_MEAN宏,所以会屏蔽comdef.h,这样就会导致声明缺失问题。

删除WIN32_LEAN_AND_MEAN宏或者手动添加包含comdef.h头文件就可以了。

最新
业务QQ