我有个COM组件,里面有好多类,(库的名字和类的名字是不一样的)我想在VC中调用其中的一个类         HRESULT hrEng = 0;
hrEng = CoInitialize(NULL);
ICApiEnginePtr pCEngine;

hrEng = pCEngine.CreateInstance(__uuidof(CApiEngine));
if(FAILED(hrEng))
{
AfxMessageBox("加载控件错误");
}
hrEng 的值始终是负的,哪里错了,看了好多文章还是没发现,请指教一下阿

解决方案 »

  1.   

    New applications should call CoInitializeEx instead of CoInitialize.
      

  2.   

    组件注册了 UID也对
    struct /* coclass */ CApiEngine;
    struct __declspec(uuid("96926842-b7c7-42ae-86ca-419d378be654"))
    /* dual interface */ ICApiEngine;CoInitializeEx这个在我VC中报错
    error C2065: 'CoInitializeEx' : undeclared identifier就是不成功阿 怎么办阿,里面除了CApiEngine外还有其他的
    struct /* coclass */ CApiFileCOM;
    struct __declspec(uuid("27c51763-f7cf-414c-9844-58276009e31b"))
    /* dual interface */ ICApiFileCOM;
    好多个呢 和这个有关系么?
      

  3.   

    失败的原因肯定是CLSID不对,你最好就对象的CLSID找出来,也就是CLSID_xxx, 用CLSID标识
      

  4.   

    最好是用原始的com调用方法,. CoCreateInstance, 然后QueryInterface(), 这样很快就能发现问题所在了.
      

  5.   

    CLSID到哪里去找阿,没找到,也不会用阿
    wangjs720(听雨舟) yuantao(cfan) 两位能给个例子出来么
      

  6.   

    CoInitializeEx是调用DCOM初始化函数,
    一般还是调用CoInitialize,或者AfxOleInit函数
    使用#import "你的dll.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids
    编译指令,针对每一个接口的classname,会自动导入CLSID_CLASSNAME,比如你需要调用
    IDoIt,则会导入CLSID_Doit,可以打开导入的tlh和tli文件查找。
      

  7.   

    把HRESULT 值用HEX格式打印出来,看看是什么错误,再对症下药
      

  8.   

    先用VB调用试试看看能不能成功,不行的话就是COM本身的问题。
    感觉科学家是CLSID不对。
      

  9.   

    谢谢 foremans(Noodles) 是产生CLSID_CLASSNAME,可下面怎么用阿
      

  10.   

    VB中没调用过不过在delphi和C++builder中正常
      

  11.   

    extern "C" const GUID __declspec(selectany) CLSID_CApiEngine =
        {0xbe3919db,0x8c9e,0x417f,{0x9e,0x59,0xc3,0x4b,0xe9,0xcc,0xf3,0xa9}};
    extern "C" const GUID __declspec(selectany) IID_ICApiEngine =
        {0x96926842,0xb7c7,0x42ae,{0x86,0xca,0x41,0x9d,0x37,0x8b,0xe6,0x54}};