我做了一个COM 组件在WIN2000下好用,在WIN98下不好使了,为什么啊?下面是客户端调用代码:         HRESULT hr;
IFirst_ATL *IFirstATL = NULL; // 初始化COM
hr = CoInitialize(0); // 使用 SUCCEEDED 宏并检查我们是否能得到一个接口指针 
if(SUCCEEDED(hr))
{
hr = CoCreateInstance( CLSID_First_ATL, NULL, CLSCTX_INPROC_SERVER,
IID_IFirst_ATL, (void**) &IFirstATL);

// 如果成功,则调用AddNumbers 方法,否则显示相应的出错信息
               错误点:///////在98下 hr=-237459404,///////////////////
if(SUCCEEDED(hr))
{
long ReturnValue; IFirstATL->AddNumbers(5, 7, &ReturnValue);
cout << "The answer for 5 + 7 is: "ReturnValue << endl;
IFirstATL->Release();  
}
else
{
cout << "CoCreateInstance Failed." << endl;
}
}
// 释放 COM
CoUninitialize();       }为什么啊?
帮帮我,我还不想死

解决方案 »

  1.   

    多半是你没在98下注册好这个COM组件
      

  2.   

    to bluebohe(薄荷):
    谢谢!!
    我在98下也是用VC编译注册的啊,同2000下用的是同种方法
    是不是98和2000下编写COM组件时有什么不同之处啊?TO : pengliyong(Aply) :
    谢谢参与!
    不过我现在生死未卜,看来你要稍等了
      

  3.   

    这个很正常,COM组件技术是在2000后,才真正成熟起来,原来的组件在98下大多采用CORBA的,很明显,在建立实例的时候已经出错了CoCreateInstance,还有你可以试一下安装DCOM98 1、3或更高版本
      

  4.   

    你把这个com在98和2000下注册表的信息比较一下有什么不同,可能98下注册表找不到CLSID_First_ATL或者有别的写法。
      

  5.   

    在98下提示什么错误,是字符串问题搞得鬼吗,win32和win16和大的区别的。做程序就的需要一些忍耐。
      

  6.   

    首先感谢大家的救命之恩!!!!
    在98下
    程序执行到此时
    if(SUCCEEDED(hr))
    {
      ...............
      ............
    }
    else
    {
    ..................
    }
    直接跳到else语句里面了是否可这样理解:
    COM在98下不可用呢?
      

  7.   

    不是不可用,只是系统可能需要安装一些支持COM组件的服务,在WIN NT 结构下,有一个COM+ Event System服务,就是专门支持COM的,而在98下,没有服务的概念,需要安装一个DCOM98的高版本就可以了,它就是专门的98下的支持COM的服务程序
      

  8.   

    安装DCOM98的最新版本,让楼上先抢着说了呵呵
      

  9.   

    to  mfc168(闶阆) :
    我安装了DCOM981.3,但是错误依然存在,而在2000下运行正常,
    怎么办啊?
    大家再帮帮忙,多谢了!!!!!!!!!
      

  10.   

    这个就要取决于你的组件是怎么做的,毕竟在2000下做的很多程序,在98下有的就不能运行,而有时候在98下的程序在2000下不能运行,这个道理大家都明白
    建议你这样做:
    你试着在98下把你的COM组件程序重新写一遍,注册运行,如果出问题,那就是你的程序问题了在98下的程序如果能正常运行,则找到你两个程序的不同,可以写到一个程序中,定义一个宏,通过GetSystemInfo,判断是什么系统,然后调用你的程序,这样,兼容2000和98,问题就能解决了
      

  11.   

    TO  lop5712(LOP) :
       感谢关注!!!
             HRESULT hr;
    IFirst_ATL *IFirstATL = NULL; // 初始化COM
    hr = CoInitialize(0); // 使用 SUCCEEDED 宏并检查我们是否能得到一个接口指针 
    if(SUCCEEDED(hr))
    {
    hr = CoCreateInstance( CLSID_First_ATL, NULL, CLSCTX_INPROC_SERVER,
    IID_IFirst_ATL, (void**) &IFirstATL);

    // 如果成功,则调用AddNumbers 方法,否则显示相应的出错信息
                   在98下 程序执行到这时,hr=-2147221164  然后就跳到ELSE处了 
    if(SUCCEEDED(hr))
    {
    long ReturnValue; IFirstATL->AddNumbers(5, 7, &ReturnValue);
    cout << "The answer for 5 + 7 is: "ReturnValue << endl;
    IFirstATL->Release();  
    }
    else
    {
    cout << "CoCreateInstance Failed." << endl;
    }
    }
    // 释放 COM
    CoUninitialize();       }
    也就是CoCreateInstance返回失败!!!
      

  12.   

    你真的确信是这个代码 -2147221164既0xF33399BC ???
    COM提供的标准错误代码中是没有负数的呀!!不过如果真的是这个代码那真是抱歉,这样不知发生什么错误,也就不好查了。
    楼主可以将你的COM组件的工程和这个客户工程放在同一个工作空间(或解决方案)里,然后在COM组件的实现类的构造函数里下断点。
    如果是ATL编的,再在FinalConstruct里下断点,如果程序能到这,那楼主单步执行出FinalConstruct(将会到ATL源码),慢慢查看到底哪出错。
      

  13.   

    -2147221164十六进制是0x80040154,挺正常的错误吧
    不太懂COM,觉得至少应该先分析是FirstAtl组件问题还是这个CoCreateInstance调用参数问题吧
      

  14.   

    啊,多谢 xiaoqiqixiao(七七) 提醒,的确是转错了,是0x80040154,多谢。0x80040154是REGDB_E_CLASSNOTREG错误代码,表示楼主所说的类没注册,楼主还是看一下注册表信息确认一下