求大侠帮忙
const CLSID CLSID_my = {0xEB6DC847,0xB9E2,0x42B7,{0xB7,0xE2,0xC3,0x59,0x9D,0xDF,0xF0,0xDD}};
const IID   IID__my =  {0x77819406,0xB86F,0x4E0B,{0xB7,0x57,0x14,0x3A,0x53,0xC3,0xA9,0x70}};hr=CoCreateInstance(CLSID_my,NULL,
CLSCTX_ALL,
IID__my,(void **)&myRef);hr = -2147221164;对应的错误码是 REGDB_E_CLASSNOTREG,怎么会注册失败的?
CLSID在注册表找到了,也用 regsvr32 命令注册成功了,
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{EB6DC847-B9E2-42B7-B7E2-C3599DDFF0DD}
Implemented Categories (IID用的是这个下面的值,IID是这个吗?)
InprocServer32
ProgID
Programmable
TypeLib               (LIBID用的有什么用啊)            
VERSION

解决方案 »

  1.   

    查看一下InprocServer32子键的值是否正常,该路径下是否存在对于的dll或ocx
      

  2.   

    既然已经写入注册表了,那可能就是系统环境的问题了?
    网上说可能由于某些COM组件没有安装,你试试
      

  3.   


    存在,路径也是对的 
    InprocServer32子键的值:
    默认                 REG_SZ  D:\......\my.dll
    ThreadingModel     REG_SZ  Apartment
      

  4.   

    看其他机器是否也有这个问题..
    如果其他机器没有这个问题,那么很可能是这个机器环境的问题,尝试用安装光盘Repair一下
      

  5.   


    不好意思,我菜鸟啊,不晓得代理存根怎么注册的?看不明白三、关于注册
      情况1:当我们使用 ATL 编写组件程序,注册不用我们来负责。编译成功后,IDE 会帮我们自动注册;
      情况2:当我们使用 MFC 编写组件程序,由于编译器不知道你写的是否是 COM 组件,所以它不会帮我们自动注册。这个时候,我们可以执行菜单“Tools\Register Control”来注册。
      情况3:当我们写一个具有 COM 功能的 EXE 程序时,注册的方法就是运行一次这个程序;
      情况4:当我们需要使用第三方提供的组件程序时,可以命令行运行“regsvr32.exe 文件名”来注册。顺便说一句,反注册的方法是“regsvr32.exe /u 文件名”;
      情况5:当我们需要在程序中(比如安装程序)需要执行注册,那么:
      

  6.   

    创建失败的原因很多啦
    组件宿主 dll 依赖其他的东西不?
      

  7.   

    COM环境是否初始化过,CoInitialize(NULL)有没有调用过
      

  8.   


    其他机器也是一样,我怀疑是不是那个 IID  错了,CoInitialize(NULL) 有调用过
      

  9.   

    找到代理/存根DLL
    并注册一下同解决方案下的PS_XXX之类的项目,编译后注册一下
      

  10.   

    CoCreateInstanceEx试试,另外你是怎么调用COM组件?导入tlb类型库吗 ,还是直接API方式的调用?
      

  11.   

    REGDB_E_CLASSNOTREG 
    指定的类没有在注册表中注册. 也可能是指定的dwClsContext没有注册或注册表中的服务器类型损坏 
    http://blog.csdn.net/gaoxiaowei/archive/2010/06/29/5701671.aspx
    或者就是你的CLSID 跟IID给错了。
      

  12.   


    IID 是怎么找到?
      

  13.   

    试试
    extern "C" const CLSID CLSID_my = {0xEB6DC847,0xB9E2,0x42B7,{0xB7,0xE2,0xC3,0x59,0x9D,0xDF,0xF0,0xDD}};
      

  14.   


    已经是这样了
    extern "C"
    {
    const CLSID CLSID_my = {0xEB6DC847,0xB9E2,0x42B7,{0xB7,0xE2,0xC3,0x59,0x9D,0xDF,0xF0,0xDD}};
    const IID IID__my = {0x77819406,0xB86F,0x4E0B,{0xB7,0x57,0x14,0x3A,0x53,0xC3,0xA9,0x70}};
    }
      

  15.   

    用CLSIDFromProgID获取CLSID,然后创建看能否成功,中间顺便比较一下这个API获得的CLSID跟你的CLSID_my是不是相等。
      

  16.   


    通过CLSIDFromProgID把获取的CLSID,用十六进制把每个结构体成员打出来是一样的, 也获取成功了。
      

  17.   

    如果CLSIDFromProgID都成功了,创建组件时就不应该返回REGDB_E_CLASSNOTREG
      

  18.   

    是啊,就是不晓得IID对不对啊。是不是取那个值啊?
      

  19.   

    IID不对也只是返回E_NOINTERFACE而已