想做一个能把com自动导入的程序,无奈对com还不太了解,又没有时间去全面的学习这方面的东西,希望大家帮忙,指点一个方向。谢谢。

解决方案 »

  1.   

    VB得知接口信息都是根据一个tlb的文件得到的,得分析这个。
      

  2.   

    很多方法阿:
    1、CLASS WIZARD->Automation->Add class(Form a type library),所有的对象和接口都会被导入,你可以在CLASS VIEW 中看到
    2、利用OLE\COM OBJECT VIEWER
    3、加入#import "ROI32.dll" no_namespace,编译会生成*.TLH文件,所有的接口信息都能从那里找到
      

  3.   

    xiaoyuzi(小鱼子) 说的很正确。
      

  4.   

    可以查看.tlb文件。
    如果想在执行阶段动态察看的话,就得找那个组件实现的接口IProvideClassInfo或IProvideClassInfo2
      

  5.   

    .tlb文件去哪里找呢?!
    或许我说得不够清楚。
    我想要做的是一个应用程序,当这个程序执行的时候,用户选择一个com,然后我的程序可以像vb一样向用户展示这个com有几个接口,每个接口提供什么方法,需要什么参数这些信息,并且还要可以调用这些方法。
      

  6.   

    void CIEAutomationView::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR lpszUrl)
    {
    // make sure the main frame has the new URL.  This call also stops the animation
    ((CChildFrame*)GetParentFrame())->SetAddress(lpszUrl);
    CString strURL(lpszUrl);
    IUnknown* pUnkBrowser = NULL;
        IUnknown* pUnkDisp = NULL;
    TRACE(_T("Document %s Done\r\n"),lpszUrl);
    //is it top level document?
    HRESULT hr = m_pBrowserApp->QueryInterface( IID_IUnknown,  (void**)&pUnkBrowser);
    if ( SUCCEEDED(hr) ){
            hr = pDisp->QueryInterface( IID_IUnknown,  (void**)&pUnkDisp );
            if ( SUCCEEDED(hr) ){
                if ( pUnkBrowser == pUnkDisp ){
    //top level
    m_spHtmlDoc=NULL;
    hr=m_pBrowserApp->get_Document(&m_spHtmlDoc);
    TRACE(_T("Downloading Complete\r\n"),lpszUrl);
    if(m_spHtmlDoc){
    CComPtr<ITypeInfo> pTypeInfo;
    HRESULT hr = S_OK;
    hr= m_spHtmlDoc->GetTypeInfo(0, GetUserDefaultLCID(), &pTypeInfo);
    DumpTypeInfo(pTypeInfo);
    }
    }
    pUnkDisp->Release();
    }
    pUnkBrowser->Release();
    }
    m_domExternal.FireDocumentComplete(pDisp,COleVariant(lpszUrl));
    }
    HRESULT CIEAutomationView::DumpTypeInfo(ITypeInfo *pTypeInfo)
    {
    if(pTypeInfo==NULL)return S_OK;
    CSmartTypeAttr pTypeAttr( pTypeInfo );
    CSmartFuncDesc pFuncDesc( pTypeInfo );
    HRESULT hr= pTypeInfo->GetTypeAttr( &pTypeAttr );
    if(FAILED(hr))return hr;
    for(int iMethod = 0; iMethod < pTypeAttr->cFuncs; iMethod++){
    hr= pTypeInfo->GetFuncDesc(iMethod, &pFuncDesc);
    if(FAILED(hr))return hr;
    CString strInvokeType;
    switch(pFuncDesc->invkind){
    case INVOKE_FUNC :strInvokeType="Function";break;
    case INVOKE_PROPERTYGET :strInvokeType="Property(Get)";break;
    case INVOKE_PROPERTYPUT :strInvokeType="Property(Put)";break;
    case INVOKE_PROPERTYPUTREF:strInvokeType="Property(Putref)";break;
    default:break;
    }
    CComBSTR bstrName;
    unsigned int nNames;
    hr= pTypeInfo->GetNames(pFuncDesc->memid, &bstrName, 1,&nNames );
    if(FAILED(hr))return hr;
    ASSERT( nNames == 1 );
    TRACE("%s\t%s\r\n",CString(bstrName.m_str),strInvokeType);
    pFuncDesc.Release();
    }
    return S_OK;}
      

  7.   

    COM技术内幕上有关于类型库和VB的Object Browser的介绍
    首先是装载类型库,可以用LoadRegTypeLib(从注册表装载),LoadTypeLib(从指定的类型库(tlb)文件装载),LoadLibFromResource(从EXE或DLL文件装载)
    装载后将获得ITypeLib的接口指针
    用ITypeLib::GetTypeInfoCount()和ITypeLib::GetTypeInfo遍历ITypeLib获得所有ITypeInfo接口指针
    用ITypeInfo接口指针就可以获得组件,接口,属性,方法等的所有信息了
    具体自己查查msdn了
      

  8.   

    在编译后,会生成一个tlh文件,察看该文件就可以获得接口信息的阿