MFC用COM方式调用ActiveX类型的DLL

来源:互联网 发布:网络人netman 编辑:程序博客网 时间:2024/05/18 01:58

MFCCOM方式调用ActiveX类型的DLL

 

1          准备:

第三方提供给你一个文件Hehex.dll,你要调用其中的MyFunc01函数,函数原型为

int    MyFunc01 ( long paramA, TCHAR* paramB, BOOLparamC)

如果要用InvokeHelper函数传送多个参数给MyFunc01。而且只知道DLL的注册名,没有.odl文件查看MyFunc01函数对应的属性ID,那么可以用下面的方法。

关键部分:

1.1         InvokeHelper函数pbParamInfo的写法。

1.2         GetIDsOfNames得到DISPIDID号。

2          步骤:

2.1         先注册DLL

2.1.1    假设在Hehex.dll放在HaiActiveX文件夹下。

2.1.2    DOS命令窗口下切换到Hehex.dll所在目录输入注册命令:regsvr32 Hehex.dll

2.1.3    注册成功,在注册表中搜索到Hehex.dll对应的注册名比如为

Hehex. HaiActiveX

2.2         程序:

2.2.1    初始化COM组件:

       // 初始化COM,创建ADO连接等操作

       if(!AfxOleInit())//这就是初始化COM

       {

              AfxMessageBox(_T("KE初始化出错!"));

              return FALSE;

       }

 

2.2.2     简单程序如下:

voidCHaiDlg::Haitest()

{

       DISPID   lDispID;//MyFunc01对应的属性ID

       COleDispatchDriver       m_calc;

 

       COleException e;

       CLSID clsid;

 

//加载     Hehex.HaiActiveX

       if(CLSIDFromProgID(OLESTR("Hehex.HaiActiveX"), &clsid) != NOERROR)

       {

              AfxMessageBox(_T("Hehex.HaiActiveX失败"));

              return      FALSE;

       }

 

       // try to get the active calculatorbefore creating a new one

       LPUNKNOWN lpUnk;

       LPDISPATCH lpDispatch;

       if (GetActiveObject(clsid, NULL,&lpUnk) == NOERROR)

       {

              HRESULT hr = lpUnk->QueryInterface(IID_IDispatch,

                     (LPVOID*)&lpDispatch);

              lpUnk->Release();

              if (hr == NOERROR)

                     m_calc.AttachDispatch(lpDispatch,TRUE);

 

              HaiTestShow(_T("得到成员成功"));

 

       }

 

       // if not dispatch ptr attached yet, needto create one

       if (m_calc.m_lpDispatch == NULL&&

              !m_calc.CreateDispatch(clsid,&e))

       {

              StatusShow(_T("创立成员失败"));

 

              AfxMessageBox(_T("创立失败"));

              return      FALSE;

       }

 

 

//得到MyFunc01函数对应的DISPID,属性ID

       HRESULT      hresult=0;

       OLECHAR FAR* szMember =_T("MyFunc01");

 

       hresult = m_calc.m_lpDispatch->GetIDsOfNames(

                                   IID_NULL,

                                   &szMember,

                                   1,LOCALE_SYSTEM_DEFAULT,

                                   &lDispID);

 

       if (S_OK != hresult)

       {

              AfxMessageBox(_T("得到DISPID错误"));

              return      FALSE;

       }

 

 

//使用InvokeHelper通过MyFunc01对应的属性ID,传入多个参数。

       try

       {

              int    resultFlag = 0;

              static BYTE parms[] =VTS_PI4  VTS_PI1 VTS_BOOL; //注意传入三个参数对应类型用空格分开,参数类型可以到Afxdisp.h中查找

 

              m_calc.InvokeHelper(lDispID,DISPATCH_METHOD, VT_INT, (void*)&resultFlag,

                                                 parms,//pbParamInfo传入的参数类型

                                                 125,  //输入参数paramA

                                                 _T("heolw.sllsls"),//输入参数paramB

                                                 _variant_t(TRUE));////输入参数paramC

       }

       catch( CException *e)

       {

              TCHAR   szError[1024]; 

              e->GetErrorMessage(szError,1024);

              ::AfxMessageBox(szError);

              return      FALSE;

       }

             

       return TRUE;

 

}

 

 

 

3          结束

 

 

原创粉丝点击