读书人

error C2787: amp;#39;IxxxxObjectamp;#39;

发布时间: 2012-08-21 13:00:21 作者: rapoo

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

error C2787: '

no GUID has been associatedwith this object解决方法

1>error C2787:1>error C2440:1>error C2440:

之前把一个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

读书人网 >Ruby Rails

热点推荐