• 4、错误"no GUID has been associated with this object"的解决方法


    [问题描述]

    VS2008编译windows shell,成功;相同的方法在VS2005下,提示错误:

    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 <shlguid.h>

    下面是收集的一些问题解决过程:

    1Have 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

    2There are two <comdef.h> header files in VC.NET, one in Vc7/include and the other in Vc7/PlatformSDK/include. The former splits off the smart pointer typedefs into comdefsp.h, and it doesn't include IContextMenu. The latter does. You can try to #include the PlatformSDK header directly, change your INCLUDE path order, or supply the missing typedef yourself, e.g.

    struct __declspec(uuid("000214e4-0000-0000-c000-000000000046"))

    IContextMenu;

    _COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));

    3、怎样找到InterfaceGUID?

    我在注册表 HKCR\Interface\ 下可以找到形式为

    {aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}的键,如果其下有默认项="Interface",则说明这个键就是该InterfaceGUID

    有没有其它方法?

    (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));

    过了这个村,还会有下个店,还不如直接更新一下SDK来得直接保险。

    参考:

    [1] 比较杂,没有记录出处。可以GOOGLE到。

  • 相关阅读:
    DataSnap(MIDAS)三层架构中,常用事件及其触发顺序
    如何让中间层MIDAS/DATASNAP支持大量的并发用户并且控制连接数量
    插件之注册插件和注册插件中的模块
    TField.ProviderFlags
    datasnap生命期LifeCycle
    datasnap服务器支持的参数类型
    TDSAuthenticationManager的用法
    泛型实现的对象池
    服务器端如何防止DDOS
    获得客户端的信息
  • 原文地址:https://www.cnblogs.com/mydomain/p/1895775.html
Copyright © 2020-2023  润新知