`
dato0123
  • 浏览: 940042 次
文章分类
社区版块
存档分类
最新评论

IImage和链接错误

 
阅读更多
//========================================================================
//TITLE:
// IImage和链接错误
//AUTHOR:
// norains
//DATE:
// Tuesday 14-August-2007
//Environment:
// EVC4.0 + Windows CE 5.0 Standard SDK
//========================================================================

IImage组件是在wince5.0新加入的,它可以调用公共接口来显示多种图片格式(jpg,png,gif,bmp),并且还可以扩展用以支持更多图片.但也许是因为新加入的原因,尚存在不少问题,其中编译的error link 2005就令人非常头痛.

首先让我们先来看看一个能够编译通过的最简单IImage的用法:


//////////////////////////////////////////////////////////////////////
//TempApp.cpp:Definestheentrypointfortheapplication.
//
//////////////////////////////////////////////////////////////////////

#include
"stdafx.h"
#include
"initguid.h"
#include
"imaging.h"

#pragmacomment(lib,"Ole32.lib")

voidOpen()
{

IImage
*pImage;
IImagingFactory
*pImagingFactory;

HRESULThr;

if(FAILED(hr=CoInitializeEx(NULL,COINIT_MULTITHREADED)))
{
gotoEND;
}

if(FAILED(hr=CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImagingFactory)))
{
gotoEND;
}

if(FAILED(hr=pImagingFactory->CreateImageFromFile(TEXT("测试.bmp"),&pImage)))
{
gotoEND;
}


END:
if(pImage!=NULL)
{
pImage
->Release();
pImage
=NULL;
}

if(pImagingFactory!=NULL)
{
pImagingFactory
->Release();
pImagingFactory
=NULL;
}

CoUninitialize();

}



intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
intnCmdShow)
{
//TODO:Placecodehere.

Open();
return0;
}


在这个文件中,我们需要注意两点

1.头文件的包含次序.
#include "initguid.h"一定要在#include "imaging.h"之前.如果不包含"initguid.h"或在#include "imaging.h"之后含,则编译时会出现错误:
TempApp.obj : error LNK2001: unresolved external symbol CLSID_ImagingFactory
TempApp.obj : error LNK2001: unresolved external symbol IID_IImagingFactory

2."Ole32.lib"需要pragma
如果"Ole32.lib"没有pragma的话,那么编译的时候将会出现如下错误:
TempApp.obj : error LNK2019: unresolved external symbol __imp_CoUninitialize referenced in function "void __cdecl Open(void)" (?Open@@YAXXZ)
TempApp.obj : error LNK2019: unresolved external symbol __imp_CoCreateInstance referenced in function "void __cdecl Open(void)" (?Open@@YAXXZ)
TempApp.obj : error LNK2019: unresolved external symbol __imp_CoInitializeEx referenced in function "void __cdecl Open(void)" (?Open@@YAXXZ)
MIPSIIDbg/TempApp.exe : fatal error LNK1120: 3 unresolved externals




如果将IImage组件用类的形式封装,那么在头文件的包含顺序就更有讲究.

这个是一个完整的能通过编译的例子:

//////////////////////////////////////////////////////////////////////
//TempApp.cpp:Definestheentrypointfortheapplication.
//
//////////////////////////////////////////////////////////////////////

#include
"stdafx.h"
#include
"imgtest.h"




intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
intnCmdShow)
{
//TODO:Placecodehere.

CImgTestimgTest;
imgTest.Open();
return0;
}

//////////////////////////////////////////////////////////////////////
//ImgTest.h:interfacefortheCImgTestclass.
//
//////////////////////////////////////////////////////////////////////

#ifndefIMGTEST_H
#defineIMGTEST_H

#include
"imaging.h"

classCImgTest
{
public:
voidOpen();
CImgTest();
virtual~CImgTest();

protected:
IImage
*pImage;
IImagingFactory
*pImagingFactory;
};

#endif//#ifndefIMGTEST_H

//////////////////////////////////////////////////////////////////////
//ImgTest.cpp:implementationoftheCImgTestclass.
//
//////////////////////////////////////////////////////////////////////

#include
"stdafx.h"
#include
"initguid.h"
#include
"ImgTest.h"


#pragmacomment(lib,"Ole32.lib")


CImgTest::CImgTest()
{

}

CImgTest::
~CImgTest()
{

}

voidCImgTest::Open()
{


HRESULThr;

if(FAILED(hr=CoInitializeEx(NULL,COINIT_MULTITHREADED)))
{
gotoEND;
}

if(FAILED(hr=CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void**)&pImagingFactory)))
{
gotoEND;
}

if(FAILED(hr=pImagingFactory->CreateImageFromFile(TEXT("测试.bmp"),&pImage)))
{
gotoEND;
}


END:
if(pImage!=NULL)
{
pImage
->Release();
pImage
=NULL;
}

if(pImagingFactory!=NULL)
{
pImagingFactory
->Release();
pImagingFactory
=NULL;
}

CoUninitialize();
}


CImgTest是将IImage COM封装的一个类,在这里例子里我们尤为要注意的是#include "initguid.h"的位置:位于"ImgTest.cpp"中,并且在"ImgTest.h"之前.看到这里,可能有的朋友会觉得奇怪,直接将#include "initguid.h"写在"ImgTest.h"中不行么?答案是否定的.

我们可以更改头文件的包含,做个测试.

更改后的头文件如下:

//////////////////////////////////////////////////////////////////////
//ImgTest.h:interfacefortheCImgTestclass.
//
//////////////////////////////////////////////////////////////////////

#ifndefIMGTEST_H
#defineIMGTEST_H

#include
"ImgTest.h"
#include
"imaging.h"

classCImgTest
{
public:
voidOpen();
CImgTest();
virtual~CImgTest();

protected:
IImage
*pImage;
IImagingFactory
*pImagingFactory;
};

#endif//#ifndefIMGTEST_H



编译时将出现错误:
ImgTest.obj : error LNK2005: ENCODER_SAVE_FLAG already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_CHROMINANCE_TABLE already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_LUMINANCE_TABLE already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_TRANSFORMATION already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_ROTATION already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_QUALITY already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_RENDERMETHOD already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_VERSION already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_SCANMETHOD already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_COLORDEPTH already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ENCODER_COMPRESSION already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: DECODER_USEICC already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: DECODER_ICONRES already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: DECODER_OUTPUTCHANNEL already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: DECODER_TRANSRANGE already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: DECODER_TRANSCOLOR already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FMTID_JpegAppHeaders already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FMTID_ImageInformation already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FRAMEDIM_PAGE already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FRAMEDIM_RESOLUTION already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FRAMEDIM_TIME already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IImageBytes already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IBasicBitmapOps already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IImageSink already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IImageEncoder already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IImageDecoder already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IBitmapImage already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IImage already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: CLSID_ImagingFactory already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IID_IImagingFactory already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_ICO already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_FLASHPIX already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_PHOTOCD already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_EXIF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_TIFF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_GIF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_PNG already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_JPEG already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_WMF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_EMF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_BMP already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_MEMORYBMP already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: IMGFMT_UNDEFINED already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: CodecIImageBytes already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderSaveFlag already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderChrominanceTable already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderLuminanceTable already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderTransformation already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderQuality already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderRenderMethod already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderVersion already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderScanMethod already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderColorDepth already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: EncoderCompression already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FormatIDJpegAppHeaders already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FormatIDImageInformation already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FrameDimensionPage already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FrameDimensionResolution already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: FrameDimensionTime already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatIcon already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatEXIF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatTIFF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatGIF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatPNG already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatJPEG already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatWMF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatEMF already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatBMP already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatMemoryBMP already defined in ImageIntroduce.obj
ImgTest.obj : error LNK2005: ImageFormatUndefined already defined in ImageIntroduce.obj


那么在"ImgTest.cpp"中将#include "initguid.h"放置 #include "ImgTest.h"之后也不行么?答案依然是否定的.如果放在之后,则编译时会出现如下错误:
ImgTest.obj : error LNK2001: unresolved external symbol CLSID_ImagingFactory
ImgTest.obj : error LNK2001: unresolved external symbol IID_IImagingFactory
MIPSIIDbg/ImageIntroduce.exe : fatal error LNK1120: 2 unresolved externals


IImage的使用很简单也很方便,唯一需要注意的仅仅是#include "initguid.h"语句的位置而已,而这点却又往往让我们忽略,从而造就一些莫名其妙的链接错误.
分享到:
评论

相关推荐

    IImage使用源码.zip

    此外,源码还可能包含错误处理和调试信息,这对于理解底层工作原理和解决实际问题非常有价值。开发者可以根据这个接口设计自己的图像处理模块,或者对现有的IImage实现进行扩展和优化,以满足特定项目的需求。 总的...

    IImage使用源码

    在Windows CE环境下,IImage接口是一个关键的组件,主要用于处理和显示JPEG、PNG等多种图像格式。这个接口提供了图像加载、渲染以及控制的功能,使得开发者能够方便地在嵌入式设备上实现图片的显示。本文将深入探讨...

    使用 IImage 接口实现简易的图片浏览器功能

    IImage是Windows CE操作系统提供的一个核心接口,它允许开发者访问和操作图像数据,包括读取、显示和处理图像。该接口提供了一系列方法,如打开图像文件、获取图像尺寸、设置和获取图像属性等,使得我们可以方便地...

    IImage.rar_iimage

    在Windows CE 4.0或更高版本的系统中,实现屏幕截图并将其转换为JPEG格式是一项常见的需求。IImage.rar_iimage项目似乎提供了一个...在实际应用中,还需要关注性能、内存管理和错误处理,以确保软件的稳定性和效率。

    wince下IImage组件显示图片(wince)

    1. 错误处理:由于IImage组件操作可能涉及到文件读取、内存分配等,因此必须处理可能出现的错误,例如文件不存在、内存不足等。通过检查函数返回值和调用GetLastError函数获取错误信息,可以有效定位并解决这些问题...

    IImage_Test.zip_iimage_wince

    总的来说,"IImage_Test.zip_iimage_wince"项目为开发者提供了一个学习和实践Windows CE 6.0中IImage接口的宝贵平台。通过研究和理解这个示例,开发者不仅可以掌握IImage接口的基本用法,还能深入了解如何在嵌入式...

    IImage.rar_iimage_iimage mfc_多线程 win32

    总之,"IImage.rar_iimage_iimage mfc_多线程 win32"的主题涵盖了使用MFC和Win32 API进行多线程图像处理的各个方面,包括线程创建、同步、通信以及资源管理。这些技术在开发高性能、高并发的图像处理软件时非常有用...

    IImage.rar_wince 图片

    IImage组件是微软为Windows CE开发的图像处理接口,它允许程序员在有限的嵌入式系统资源下处理和显示图像。这个组件支持多种图像格式,并且提供了灵活的图像操作功能,如缩放、旋转和颜色转换等。 在MFC应用中集成...

    WINCE中图片浏览(IImage组件使用源码)

    在实际开发中,你可以参考这些源代码了解IImage组件的具体使用方法,包括错误处理、内存管理以及更复杂的图像操作。 总的来说,通过理解和应用IImage组件,我们可以有效地在Windows CE系统中实现图片的浏览和操作。...

    MFC绘图类CImageShow(使用IImage接口实现)

    在这个特定的案例中,我们关注的是一个名为"CImageShow"的MFC类,该类是专为图像显示和处理而设计的,特别是基于IImage接口的实现。IImage接口可能是一个自定义接口,用于抽象和封装图像操作。 `CImageShow`类的...

    Imaging.rar

    总结起来,要在Windows Mobile(WM)平台上显示JPEG或PNG压缩图片,我们需要了解.NET Compact Framework、IImage接口、GDI+以及如何有效地加载和显示图像。通过正确地使用这些技术,可以在WM设备上实现丰富的图像...

    基于BREW的图片装载演示

    本教程将深入探讨如何在BREW平台上利用IImage接口来加载和显示图片,这对于BREW应用的界面设计和用户体验至关重要。 首先,我们需要了解IImage接口。IImage是BREW图形库中的核心接口之一,它提供了处理和显示图像的...

    wince下JPG图片格式显示

    IIMAGE组件是WinCE中的图像处理接口,它为开发者提供了一种方便的方式来处理和显示不同格式的图像,包括JPEG(JPG)。 首先,了解IIMAGE组件的基本概念是必要的。IIMAGE组件是Microsoft Platform SDK为Windows CE...

    PC与WinCE通用的图片显示类(支持PNG半透明效果)

    这个类巧妙地利用了PC上的GDI+库和WinCE上的IImage接口,确保在两个平台上都能正确地处理和显示PNG图像。 首先,`Picture`类是这个跨平台图片显示的核心。它可能包含以下几个关键组件: 1. **GDI+支持**:在PC平台...

    7 iimage接口

    IImage接口计算机系计算机科学与技术教研室办公室:C117IImage接口介绍 drawing bitmap imagesdisplaying animated bitmapsEach insta

    wince 图片类

    HRESULT RotateImage(IImagingFactory *pImgFactory, IImage *pImage, IImage * &pImageOut;, LPBYTE &pImageBuf;, double angle);//png图片旋转,任意角度,注意释放pImageBuf void RotateJpg(IImagingFactory ...

    用PNG图片做按钮的时间设置程序

    例如,确保程序在不同操作系统和屏幕分辨率下都能正常工作,对大量图片的处理进行优化以避免内存占用过大,以及对可能出现的异常情况提供合适的错误提示和处理机制。 总结,通过IImage库和PNG图片的ALPHA通道,我们...

    Brew位图加载程序

    1. **初始化**:首先,程序需要初始化IImage接口实例,这通常涉及到分配内存和设置图像的基本属性,如宽度、高度和颜色深度。 2. **加载位图**:然后,加载位图文件(例如,从文件系统或网络中读取)。在这个例子中...

    evc testimage

    在这个“evc testimage”项目中,我们看到的是一个针对EVC环境下的IIMAGE图片处理程序。这个程序特别之处在于它能够实现图片的缩放功能,这对于在资源有限的嵌入式设备上处理图像信息来说非常关键。 IIMAGE接口是...

Global site tag (gtag.js) - Google Analytics