怎样获得一个未注册的com dll的CLSID,已知该com组件只有一个CLSID,谢谢!

解决方案 »

  1.   

    注册一下就知道了使用CLSIDFromProgID、CLSIDFromProgIDEx函数
      

  2.   

    是啊  不注册你的com有用吗?
      

  3.   

    1、注册该组件
    2、从注册表查出它的CLSID
    3、反注册该组件
    4、把查到的CLSID写死到自己的代码中
      

  4.   

    我是想在注册之前,就得到组件的CLSID,判断这个clsid是否已经存在,如果不存在就用程序给注册,否则要给出提示,目前需求就是这样,谢谢!
      

  5.   

       可以采用如下方法判断某个组件是否注册:
       通过组件的ProgID从注册表获取CLSID,如果CLSID为空,则表示该组件未注册。
      

  6.   

    本帖最后由 tttyd 于 2010-03-18 13:26:30 编辑
      

  7.   

    是啊  你先注册,得ProgID。
    然后你再CLSIDFROMPROGID 看能不能得CLSID就可以了。。
      

  8.   


    同意5楼观点,或者用LoadTypeLib从DLL中来获取
      

  9.   

    tttyd说的方法,我清楚,但目前不能这样做,我这边就要求只有一个com组件dll文件,还有一个tlb文件,不能注册,就要得到com对象的CLSID,谢谢!
      

  10.   

     ITypeLib* pItypelib = NULL;
     hr = ::LoadRegTypeLib(LIBID_ATLLIBLib,1,0,0,&pItypelib);
     if (SUCCEEDED(hr))
     {
      ITypeInfo * ptinfo = NULL;
              hr = pItypelib->GetTypeInfoOfGuid(CLSID_LibAdd,&ptinfo);
      pItypelib->Release();
    不知道ITypeLib 这样获得CLSID?
      

  11.   

    呵呵可以了
    CoInitialize(0);
         HRESULT hr;
     ITypeLib* pItypelib = NULL;
     hr = ::LoadTypeLib("Filepath",&pItypelib);
     if (SUCCEEDED(hr))
     {
      ITypeInfo * ptinfo = NULL;
              hr = pItypelib->GetTypeInfoOfGuid(CLSID_LibAdd,&ptinfo);
      pItypelib->Release();
      if (SUCCEEDED(hr))
      {
      TYPEATTR * ptypeat= NULL;
      ptinfo->GetTypeAttr((TYPEATTR**)&ptypeat);
      GUID m_clsid=ptypeat->guid;
      

  12.   

    用资源工具打开com dll,然后rgs资源提取出来,如果有rgs资源的话,一般都有CLSID
      

  13.   

    SullenSun的回答,接近了我想要的结果,只是不知道CLSID_LibAdd是怎么来的?
      

  14.   

    好像使用CLSIDFromProgID、CLSIDFromProgIDEx函数就可以!
      

  15.   

    只知道动态库组件的路径和名字,没有注册,ProgID从哪里来?
      

  16.   

    不好意思 写错了
    CoInitialize(0);
    HRESULT hr;
    ITypeLib* pItypelib = NULL;
    hr = ::LoadTypeLib("Filepath",&pItypelib);
    if (SUCCEEDED(hr))
    {
                      TLIBATTR * LPtlib= NULL;
      pItypelib->GetLibAttr((TLIBATTR **)&LPtlib);
      GUID g2 =LPtlib->guid;
    }
      

  17.   

    我晕,楼主在钻牛角尖,一个COM的CLSID是固定的,随便找个方法人工取得就足够了,然后写到代码里去测试这个CLSID是不是能创建组件,为什么一定要到用户机器上用代码获取?难道同一个DLL在不同机器上的CLSID不一样?有点自找麻烦。
      

  18.   

    楼上的各位辛苦了,SullenSun的方法得到是组件类型库的id,不是com对象的clsid!
      

  19.   

    楼主再试一试
    CoInitialize(0);
    HRESULT hr;
    ITypeLib* pItypelib = NULL;
    hr = ::LoadTypeLib("Filepath",&pItypelib);
    if (SUCCEEDED(hr))
    {
    ITypeInfo * ptinfo = NULL;
    hr = pItypelib->GetTypeInfo(0,&ptinfo);
    pItypelib->Release();
    if (SUCCEEDED(hr))
    {
    TYPEATTR * ptypeat= NULL;
    ptinfo->GetTypeAttr((TYPEATTR**)&ptypeat);
    GUID m_clsid=ptypeat->guid;}}
      

  20.   

    谢谢SullenSun,你非常的聪明,你解决了我的问题,也感谢那些说我钻牛角尖的朋友们,需求就那样,我们搞技术的也没有办法,谢谢大家!