如何在vc中编程获得com的接口信息像vb那样 想做一个能把com自动导入的程序,无奈对com还不太了解,又没有时间去全面的学习这方面的东西,希望大家帮忙,指点一个方向。谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VB得知接口信息都是根据一个tlb的文件得到的,得分析这个。 很多方法阿:1、CLASS WIZARD->Automation->Add class(Form a type library),所有的对象和接口都会被导入,你可以在CLASS VIEW 中看到2、利用OLE\COM OBJECT VIEWER3、加入#import "ROI32.dll" no_namespace,编译会生成*.TLH文件,所有的接口信息都能从那里找到 xiaoyuzi(小鱼子) 说的很正确。 可以查看.tlb文件。如果想在执行阶段动态察看的话,就得找那个组件实现的接口IProvideClassInfo或IProvideClassInfo2 .tlb文件去哪里找呢?!或许我说得不够清楚。我想要做的是一个应用程序,当这个程序执行的时候,用户选择一个com,然后我的程序可以像vb一样向用户展示这个com有几个接口,每个接口提供什么方法,需要什么参数这些信息,并且还要可以调用这些方法。 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;} COM技术内幕上有关于类型库和VB的Object Browser的介绍首先是装载类型库,可以用LoadRegTypeLib(从注册表装载),LoadTypeLib(从指定的类型库(tlb)文件装载),LoadLibFromResource(从EXE或DLL文件装载)装载后将获得ITypeLib的接口指针用ITypeLib::GetTypeInfoCount()和ITypeLib::GetTypeInfo遍历ITypeLib获得所有ITypeInfo接口指针用ITypeInfo接口指针就可以获得组件,接口,属性,方法等的所有信息了具体自己查查msdn了 在编译后,会生成一个tlh文件,察看该文件就可以获得接口信息的阿 关于VC实现结束进程 OK系列相机,保存图片为系统时间,求高手赐教,小女子初学VC 【招聘】C++/VC兼职 First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception. vc中如何制作荧光笔 windows.h 请问各位大虾能帮我解决这个CDialogBar优先停靠左或右而不是上下!在线等 我想从事数据库应用软件的开发,应该学习哪种语言? 手动添加消息 如何判断一个程序的语言版本 请教关于文件存储和读取的问题!!!! ping本机IP不通的问题
1、CLASS WIZARD->Automation->Add class(Form a type library),所有的对象和接口都会被导入,你可以在CLASS VIEW 中看到
2、利用OLE\COM OBJECT VIEWER
3、加入#import "ROI32.dll" no_namespace,编译会生成*.TLH文件,所有的接口信息都能从那里找到
如果想在执行阶段动态察看的话,就得找那个组件实现的接口IProvideClassInfo或IProvideClassInfo2
或许我说得不够清楚。
我想要做的是一个应用程序,当这个程序执行的时候,用户选择一个com,然后我的程序可以像vb一样向用户展示这个com有几个接口,每个接口提供什么方法,需要什么参数这些信息,并且还要可以调用这些方法。
{
// 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;}
首先是装载类型库,可以用LoadRegTypeLib(从注册表装载),LoadTypeLib(从指定的类型库(tlb)文件装载),LoadLibFromResource(从EXE或DLL文件装载)
装载后将获得ITypeLib的接口指针
用ITypeLib::GetTypeInfoCount()和ITypeLib::GetTypeInfo遍历ITypeLib获得所有ITypeInfo接口指针
用ITypeInfo接口指针就可以获得组件,接口,属性,方法等的所有信息了
具体自己查查msdn了