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接口:
#if defined(__cplusplus)&& !defined(CINTERFACE)
MIDL_INTERFACE("00020400-0000-0000-C000-000000000046")
IDispatch : publicIUnknown
而IInputObject的接口声明则没有了:
#undef INTERFACE
#define INTERFACE 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宏定义:
#define COM_INTERFACE_ENTRY(x)\
{&_ATL_IIDOF(x),\
offsetofclass(x,_ComMapClass), \
_ATL_SIMPLEMAPENTRY},
COM_INTERFACE_ENTRY_IID宏定义:
#define COM_INTERFACE_ENTRY_IID(iid,x)\
{&iid,\
offsetofclass(x,_ComMapClass),\
_ATL_SIMPLEMAPENTRY},
作者:magictong
补充:软件开发 , C++ ,