ATL IDispatch调度接口

转载自:http://blog.csdn.net/shimazhuge/article/details/8825861

目录(?)[+]

概述

IDispatch接口:完成接口调度的接口,可以不使用头文件完成接口的函数调用

IDispatch 接口函数

  •      1> GetIDsOfNames-根据接口函数的名称获取接口函数的ID
  •      2> Invoke-根据接口函数ID,调用接口函数
  •      3>GetTypeInfo-获取指定的类型信息接口
  •      4>GetTypeInfoCount-获取指定类型信息接口的数量

IDispatch项目

   创建项目: 增加组件和接口时,要选择“dual”,增加IDispatch接口的支持

   项目变化

  •          文件的变化;接口的父接口,是IDispatch接口;当添加接口函数时,会自动添加接口函数的ID
  •          组件的实现类:父类增加了IDispathImpl
[cpp]  view plain  copy
  1. GetIDsOfNames函数  
  2. HRESULT GetIDsOfNames(   
  3. REFIID riid, //保留值,IID_NULL  
  4. OLECHAR FAR *FAR *rgszNames,//接口函数名字符串数组   
  5. unsigned int cNames, //数组长度  
  6. LCID lcid, //语言ID ,LOCALE_SYSTEM_DEFAULT  
  7. DISPID FAR *rgDispId //返回查询到的接口函数的ID号数组        
  8. );  
  9. Invoke函数  
  10. HRESULT Invoke(   
  11. DISPID dispIdMember,//接口函数的ID   
  12. REFIID riid, //保留参数,IID_NULL  
  13. LCID lcid, //语言ID  
  14. WORD wFlags, //接口函数的类型  
  15. DISPPARAMS FAR *pDispParams, //函数的参数  
  16. VARIANT FAR *pVarResult, //函数的返回值  
  17. EXCEPINFO FAR *pExcepInfo, //异常信息  
  18. unsigned int FAR *puArgErr//错误代码  
  19. );  

 实例

一创建ATL项目ATLDIsp

1.新建ATL项目ATLDisp:下一步-->应用程序类型:动态链接库DLL;支持选项:支持COM+1.0,支持部件注册器-->完成。

2.添加MyMath类:右击--添加--类-->选择ATLCOM+1.0组件-->简称:MyMath;别的默认;COM  ProgID:ATLDisp-->下一步,完成。

3.添加接口方法Add()和ShowMsg():在类视图中,右击IMyMath接口,选择 添加---方法 -->方法名:Add,参数特性 [id(1)] HRESULT Add([in] int nAdd1, [in] int nAdd2, [out,retval] int* nResult); [id(2)] HRESULT ShowMsg(void);

4.添加Add()方法的实现:在MyMath.cpp中添加:

[cpp]  view plain  copy
  1. STDMETHODIMP CMyMath::Add(int nAdd1, int nAdd2, int* nResult)  
  2. {   
  3.     *nResult=nAdd1+nAdd2;  
  4.     return S_OK;  
  5. }  
  6. STDMETHODIMP CMyMath::ShowMsg(void)  
  7. {   
  8.     MessageBox(NULL,L"Hello Dispatch!!!",L"ATLDisp",MB_OK);  
  9.     return S_OK;  
  10. }  

二创建MFCDialog的UseATLDisp项目

1.在用一个解决方案中创建MFC dialog UseATLDisp项目

2.在UseATLDisp.cpp中:

[cpp]  view plain  copy
  1. BOOL CUseATLDispApp::InitInstance()  
  2. {  
  3.     CoInitialize(0); // 现在初始化COM  
  4.     ...  
  5.   
  6.     return FALSE;  
  7. }  
  8. int CUseATLDispApp::ExitInstance()  
  9. {  
  10.     CoUninitialize();// 卸载COM  
  11.     return CWinApp::ExitInstance();  
  12. }  

3.按钮代码 

[cpp]  view plain  copy
  1. IDispatch* CUseATLDispDlg::GetDispatch()  
  2. {  
  3.     CLSID clsid={0};  
  4.     CLSIDFromProgID(L"ATLDisp",&clsid);//根据ProgID获取classID  
  5.     IDispatch* piDispatch=NULL;  
  6.     CoCreateInstance(clsid,NULL,CLSCTX_SERVER,IID_IDispatch,(LPVOID*)&piDispatch);//创建组件并返回IDispatch接口  
  7.     if (piDispatch==NULL)  
  8.     {  
  9.         AfxMessageBox(L"创建IDispatch接口失败");  
  10.     }  
  11.     return piDispatch;  
  12. }  
  13. //根据接口函数的名称获取接口函数的ID  
  14. void CUseATLDispDlg::OnBnClickedButtonGetidsofnames()  
  15. {   
  16.     IDispatch* piDispatch=GetDispatch();  
  17.     WCHAR* pszName=L"ShowMsg";//Add  
  18.     DISPID nID={0};  
  19.     piDispatch->GetIDsOfNames(IID_NULL,&pszName,1,LOCALE_SYSTEM_DEFAULT,&nID);  
  20.     CString strID;  
  21.     strID.Format(L"nID=%d",nID);  
  22.     MessageBox(strID);//Add 1; ShowMsg 2  
  23. }  
  24. //不带参数  
  25. void CUseATLDispDlg::OnBnClickedButtonNoparam()  
  26. {   
  27.     IDispatch* piDispatch=GetDispatch();  
  28.     WCHAR* pszName=L"ShowMsg";  
  29.     DISPID nID={0};  
  30.     piDispatch->GetIDsOfNames(IID_NULL,&pszName,1,LOCALE_SYSTEM_DEFAULT,&nID);  
  31.       
  32.     //使用Invoke调用函数,参数和返回值  
  33.     DISPPARAMS params={0};  
  34.     VARIANT varResult={0};  
  35.     piDispatch->Invoke(nID,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,¶ms,&varResult,NULL,NULL);  
  36. }  
  37. //带参数  
  38. void CUseATLDispDlg::OnBnClickedButtonparams()  
  39. {   
  40.     IDispatch* piDispatch=GetDispatch();  
  41.     WCHAR* pszName=L"Add";  
  42.     DISPID nID={0};  
  43.     piDispatch->GetIDsOfNames(IID_NULL,&pszName,1,LOCALE_SYSTEM_DEFAULT,&nID);  
  44.     //使用Invoke调用函数,构造参数和返回值  
  45.     VARIANT varResult={0};  
  46.     DISPPARAMS params={0};  
  47.     VARIANT varParam[3]={0};  
  48.     params.cArgs=3;  
  49.     params.rgvarg=varParam;  
  50.     //参数的顺序从右向左  
  51.     //第一个参数  
  52.     long nValue=0;  
  53.     varParam[0].vt=VT_I4|VT_BYREF;  
  54.     varParam[0].plVal=&nValue;  
  55.     //第二个参数  
  56.     varParam[1].vt=VT_I4;  
  57.     varParam[1].lVal=100;  
  58.     //第三个参数  
  59.     varParam[2].vt=VT_I4;  
  60.     varParam[2].lVal=100;  
  61.     //调用函数  
  62.     piDispatch->Invoke(nID,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,¶ms,&varResult,NULL,NULL);  
  63.     CString strValue;  
  64.     strValue.Format(L"nResult:%d",nValue);  
  65.     MessageBox(strValue);//输出结果  
  66. }  

4.界面


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值