MFC用COM方式调用ActiveX类型的DLL
来源:互联网 发布:网络人netman 编辑:程序博客网 时间:2024/05/18 01:58
MFC用COM方式调用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得到DISPID的ID号。
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 结束
- MFC用COM方式调用ActiveX类型的DLL
- 使用Luacom调用AutoItX3.dll(ActiveX/COM方式)
- DLL、ActiveX、COM的描述
- VB创建ActiveX dll 的COM服务器,VC调用VB COM方法
- mfc activeX,mfc application,mfc dll三者的区别
- MFC -> COM/ActiveX/more...
- MFC/COM调用OLE控件/ActiveX无法显示问题
- vbs调用ActiveX的DLL的方法
- DLL的调用方式
- MFC ActiveX的创建和调用
- JavaScript调用ActiveX DLL
- mfc调用activex
- MFC调用c#的dll
- mfc调用qt的dll
- DLL COM ActiveX概念整理
- DLL,ACTIVEX,COM,插件区别
- 转:DLL COM ActiveX 概念
- Activex、OLE、COM、OCX、DLL
- 对 cookies 操作!
- 显示指定文件列表中文件的全路径
- 瑞星360皆曝漏洞 态度不一恐引口水战
- DOS中的FTP命令详解
- 从技术问题变成RPWT
- MFC用COM方式调用ActiveX类型的DLL
- Effective Java 学习笔记(13)
- declare-styleable:自定义控件的属性
- 小型办公组网方案
- 数据库运维之--手工杀掉一个会话
- PL/SQL Developer 或Toad 不安装Oracle 客户端连接数据库
- 多核的网络游戏服务器开发 之 网络库(二)
- iis日志分析
- 利用 Gstreamer 写简单的MP3播放器