error C2787: 'IxxxxObject' no GUID has been associated with thisobject解决方法

error C2787: 'IxxxxObject'

no GUID has been associatedwith this object解决方法

 

1>error C2787:'IInputObject' : no GUID has been associated withthis object

1>error C2440:'initializing': cannot convert from 'DWORD_PTR' to 'const IID *'

1>error C2440:'initializing': cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall*)' to 'DWORD_PTR'

 

之前把一个IE插件工程从VS2008转换为VS2005工程时,出现了上述的问题,这种提示成组出现(C2440是常见错误但是这里明显是C2787错误连带引发的),除了IInputObject这个接口还有其它的一些接口也会出现问题,经过观察和查看源代码,发现在VS2005的头文件里面类似这些接口在声明时,没有提供GUID的声明,但是之前的一些很熟悉的接口则是有的,譬如IDispatch接口:

#ifdefined(__cplusplus)&& !defined(CINTERFACE)

   

   MIDL_INTERFACE("00020400-0000-0000-C000-000000000046")

IDispatch : publicIUnknown

 

IInputObject的接口声明则没有了:

#undef INTERFACE

#defineINTERFACE   IInputObject

 

DECLARE_INTERFACE_(IInputObject,IUnknown)

{

 

因此就出现了上面错误说明里面的对象没有GUID关联的情况,不过在VS2008里面既然能编译通过,说明两边的头文件是不同的,事实也确实如此,在网上查了一些资料,基本上都是要求去下载新的头文件,更新VS2005的头文件,然后调整include的顺序来解决[1]。实际上这个方法在一个大型的项目团队(假设有上百人,使用的都是VS2005)里面实行起来很麻烦,需要每个人都去安装更新头文件,修改VS2005的设置,因此只能再想其他办法。

再看看引发错误的那句代码:

COM_INTERFACE_ENTRY(IInputObject)

分析这个宏的实现,发现里面有一句_ATL_IIDOF(x),正是这句的存在使得编译出错。

而在VS2005的头文件里面IID_IInputObject的定义是有的,因此可以想到使用COM_INTERFACE_ENTRY_IID(IID_IInputObject,IInputObject)是不是就可以解决问题了?!

测试了一下编译通过o(_)o

 

P.S.

COM_INTERFACE_ENTRY宏定义:

#defineCOM_INTERFACE_ENTRY(x)\

     {&_ATL_IIDOF(x),\

     offsetofclass(x,_ComMapClass), \

     _ATL_SIMPLEMAPENTRY},

COM_INTERFACE_ENTRY_IID宏定义:

#defineCOM_INTERFACE_ENTRY_IID(iid,x)\

     {&iid,\

     offsetofclass(x,_ComMapClass),\

     _ATL_SIMPLEMAPENTRY},

 

参考文献

[1]'IContextMenu': no GUID has been associated with this object问题的解决http://blog.csdn.net/clever101/article/details/7544443

你可能感兴趣的:(error C2787: 'IxxxxObject' no GUID has been associated with thisobject解决方法)