[问题描述]
用VS2008编译windows shell时,成功;相同的方法在VS2005和vs2003下,提示错误:
error C2787: 'IContextMenu' : no GUID has been associated with this object
error C2440: 'initializing' : cannot convert from 'DWORD_PTR' to 'const IID *'
error C2440: 'initializing' : cannot convert from 'ATL::_ATL_CREATORARGFUNC (__stdcall *)' to 'DWORD_PTR'
[解决方法]
关键的问题是以下头文件没有包含正确
#include "shlobj.h"
#include "comdef.h"
#include
下面是收集的一些问题解决过程:
1、Have you downloaded the Latest Platfrom SDK? If so, are your vc dirs pointing to the proper include dirs, eg: shlguid.h is getting picked up from the SDK\include and not the vc98\include. You set those in the tools-Options->directories->include dirs for VC
2、There are two
struct __declspec(uuid("000214e4-0000-0000-c000-000000000046"))
IContextMenu;
_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));
3、怎样找到Interface的GUID?
我在注册表 HKCR\Interface\ 下可以找到形式为
{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}的键,如果其下有默认项="Interface",则说明这个键就是该Interface的GUID。
有没有其它方法?
(1) VC6\common\Tools 下有个OLE/COM Object Viewer 很方便,但在VC2005下就没找到这个工具
(2) PlatformSDK\include\comdef.h 中也有GUID的定义
4、__uuidof它是C++ 运算符
如上所述,如果把PlatformSDK/include放在前面仍然不可以的话,就下载新的SDK,把include目录包含进去就好了。个人感觉手动添加这些uuid值如,struct __declspec(uuid("000214e4-0000-0000-c000-000000000046"))
IContextMenu;
_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));
总结:
我采用的是将vc71/PlatformSDK/include放在前面放到vc71/include的前面解决的