刚开始研究com,好多东西都不懂,请教各位大侠
如何从一个组件dll得到它的clsid?
应该有api函数可以得到它吧?

解决方案 »

  1.   

     HRESULT CLSIDFromProgID(LPCOLESTR lpszProgID,     // 指向ProgID的指针LPCLSID pclsid             // 指向CLSID的指针);WINOLEAPI ProgIDFromCLSID(REFCLSID clsid,       // CLSID 的值,已知LPOLESTR * lplpszProgID   // 指向接收ProgID的缓冲区     );
      

  2.   

    可以用#import指令,它会自动生成接口文件,clsid都在接口文件里。
      

  3.   

    对于一个组件来说,其CLSID一般都是知道的,接口ID的通常是知道的,然后QI接口去调用的.很少用自己去获取CLSID的情况!头文件或者import都可以得到CLSID相关信息
      

  4.   

    myCom.dll
    IGetRes 接口
    --Method 1-------------------------------------------------------
      CoInitialize(NULL);
      CLSID clsid;
      CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
      CComPtr<IGetRes> pGetRes;//
      pGetRes.CoCreateInstance(clsid);
      pGetRes->Hello();
      pGetRes.Release();//
      CoUninitialize();
    --Method 2---------------------------------------------------------
      CoInitialize(NULL);
      CLSID clsid;
      HRESULT hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
      IGetRes *ptr;
      hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                    __uuidof(IGetRes),(LPVOID*)&ptr);
      ptr->Hello();
      CoUninitialize();
    --Method 3--------------------------------------------------------
      CoInitialize(NULL);
      HRESULT hr;
      CLSID clsid;
      hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
      IGetRes* ptr;
      IGetResEx* ptrEx;  //
      IClassFactory* p_classfactory;
      hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,
                          NULL,IID_IClassFactory, 
                          (LPVOID*)&p_classfactory);
      p_classfactory->CreateInstance(NULL,__uuidof(IGetRes),
                                             (LPVOID*)&ptr);
      p_classfactory->CreateInstance(NULL,__uuidof(IGetResEx),
                                             (LPVOID*)&ptrEx);
      ptr->Hello();
      ptrEx->HelloEx();
      CoUninitialize();
      

  5.   

    关键是ProgID的具体值无法确定,这种情况怎么得到clsid
      

  6.   


    现在就是点击一个组件dll,需要得到它的clsid,才能得到其它的一些信息。
      

  7.   

    oleview可以看到
    注册表里面也有
      

  8.   


    这个要求有些特殊,也就是说这个dll可能还没有注册,或是注册了但目前知道它的位置和文件名,想知道它在注册表中对应于哪些信息。
      

  9.   

    找到**_i.c,里面可以看到CLSID IID等信息的