使用方法
来源:互联网 发布:jquery.min.js ajax 编辑:程序博客网 时间:2024/04/29 02:49
三、使用方法
如果你的开发环境是 vc6.0,那么我们使用第九回中的Simple6组件为例,快去下载呀......
如果你的开发环境是 vc.net 2003,那么用第十回中的Simple8组件为例,快去下载呀......
嘿嘿,其实不下载也没有关系,因为你只要下载本回的示例程序,里面已经包含了所需的组件。但使用前不要忘了去注册呀:regsvr32.exe simple6.dll 或regsvr32.exe simple8.dll (注意别忘了输入组件的安装目录)。注册成功后,就可以使用了,使用方法有:
示例一、IDispatch 调用原理篇
void demo(){::CoInitialize( NULL );// COM 初始化CLSID clsid;// 通过 ProgID 得到 CLSIDHRESULT hr = ::CLSIDFromProgID( L"Simple8.DispSimple.1", &clsid );ASSERT( SUCCEEDED( hr ) );// 如果失败,说明没有注册组件IDispatch * pDisp = NULL;// 由 CLSID 启动组件,并得到 IDispatch 指针hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp );ASSERT( SUCCEEDED( hr ) );// 如果失败,说明没有初始化 COMLPOLESTR pwFunName = L"Add";// 准备取得 Add 函数的序号 DispIDDISPID dispID;// 取得的序号,准备保存到这里hr = pDisp->GetIDsOfNames(// 根据函数名,取得序号的函数IID_NULL,&pwFunName,// 函数名称的数组1,// 函数名称数组中的元素个数LOCALE_SYSTEM_DEFAULT,// 使用系统默认的语言环境&dispID );// 返回值ASSERT( SUCCEEDED( hr ) );// 如果失败,说明组件根本就没有 ADD 函数VARIANTARG v[2];// 调用 Add(1,2) 函数所需要的参数v[0].vt = VT_I4;v[0].lVal = 2;// 第二个参数,整数2v[1].vt = VT_I4;v[1].lVal = 1;// 第一个参数,整数1DISPPARAMS dispParams = { v, NULL, 2, 0 };// 把参数包装在这个结构中VARIANT vResult;// 函数返回的计算结果hr = pDisp->Invoke(// 调用函数dispID,// 函数由 dispID 指定IID_NULL,LOCALE_SYSTEM_DEFAULT,// 使用系统默认的语言环境DISPATCH_METHOD,// 调用的是方法,不是属性&dispParams,// 参数&vResult,// 返回值NULL,// 不考虑异常处理NULL);// 不考虑错误处理ASSERT( SUCCEEDED( hr ) );// 如果失败,说明参数传递错误CString str;// 显示一下结果str.Format("1 + 2 = %d", vResult.lVal );AfxMessageBox( str );pDisp->Release();// 释放接口指针::CoUninitialize();// 释放 COM}示例二、CComDispatchDriver 智能指针包装类的使用方法
void demo(){// 已经进行过了 COM 初始化CLSID clsid;// 通过 ProgID 取得组件的 CLSIDHRESULT hr = ::CLSIDFromProgID( L"Simple8.DispSimple.1", &clsid );ASSERT( SUCCEEDED( hr ) );// 如果失败,说明没有注册组件CComPtr < IUnknown > spUnk;// 由 CLSID 启动组件,并取得 IUnknown 指针hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IUnknown, (LPVOID *)&spUnk );ASSERT( SUCCEEDED( hr ) );CComDispatchDriver spDisp( spUnk );// 构造只能指针CComVariant v1(1), v2(2), vResult;// 参数hr = spDisp.Invoke2(// 调用2个参数的函数L"Add",// 函数名是 Add&v1,// 第一个参数,值为整数1&v2,// 第二个参数,值为整数2&vResult);// 返回值ASSERT( SUCCEEDED( hr ) );// 如果失败,说明或者没有 ADD 函数,或者参数错误CString str;// 显示一下结果str.Format("1 + 2 = %d", vResult.lVal );AfxMessageBox( str );}示例程序中使用了 Invoke2()函数,其实你根据不同的函数,还可以使用 Invoke0()、Invoke1()、InvokeN()、PutProperty()、GetProperty()......等等等,的确很方便。
示例三、加载类型库,产生包装类来使用
这个方法使用更简单一些,如果你观察 MFC 帮你产生的包装类的实现,你就会发现,其实它调用的是 IDispatch 接口函数。使用 vc6.0 的朋友,步骤如下:
1、建立一个 MFC 的应用程序
2、开启 ClassWizard,执行 Add Class,选择 From a type library
图二、加载类型库
3、然后找到你要使用的组件文件 simple6.dll(tlb 文件也可以),选择接口后确认
图三、选择类型库中需要包装的接口
4、在适当的地方输入调用代码
#include "simple6.h"// 包装类的头文件void demo() {// 已经进行过了 COM 初始化IDispSimple spDisp;// 包装类的对象spDisp.CreateDispatch( _T("Simple6.DispSimple.1") )//启动组件spDisp.xxx(...);// 调用函数spDisp.ReleaseDispatch();// 释放接口}使用 vc.net 的朋友,步骤如下:
1、建立一个 MFC 的应用程序
2、执行菜单“添加\添加类”,选择 MFC 分类中的“类型库中的MFC类”
图四、添加类型库中的MFC类
3、选择组件文件 simple8.dll(或 tlb 文件),并选择需要包装的接口
图五、选择文件和接口
4、在适当的位置输入调用代码
#include "CDispSimple.h"// 包装类的头文件void demo(){// 已经进行过了 COM 初始化CDispSimple spDisp;// 包装类的对象spDisp.CreateDispatch( _T("Simple8.DispSimple.1") )// 启动组件spDisp.xxx(...);// 调用函数spDisp.ReleaseDispatch();// 释放接口}示例四、使用 #import 方式调用组件
#import 方式在第七回中已经作过介绍,这里就不多罗嗦了。大家下载本回的示例程序后,自己去看吧。并且一定要掌握这个方法,因为它的运行效率是最快的呀。
四、小结
留作业啦。在我们以前所实现的所有组件程序中,只添加了接口方法(函数),而没有添加接口属性(变量),你自己练习一下吧,很简单的,然后写个程序调用看看。其实对于 VC 来说,调用属性和调用方法没有太大的区别(vc 把属性包装为 GetXXX()/PutXXX()或getXXX()/putXXX()的函数方式),但在另外一些语言中(比如脚本语言)则更方便,设置属性值是:对象.属性 = 变量或常量,获取属性值是:变量 = 对象.属性。
本回书至此做一了断,更多组件设计和使用的知识,且听下回分解......
- 使用方法
- CSDNBlog使用方法
- 游标使用方法
- Sappy使用方法
- NetSH使用方法
- 一般使用方法
- sp_addlinkedserver使用方法
- shutdown使用方法
- 缓存使用方法
- want使用方法
- log4j使用方法
- log4j使用方法
- adostoreproc使用方法
- vi 使用方法
- Velocity 使用方法
- Regsvr32使用方法
- NUnit使用方法
- SkinMagic使用方法
- MYSQL中CHAR,VARCHAR,BLOB和TEXT的比较
- thrift-0.8.0 tutorial中的一个错误
- 计算机视觉库OpenCV在MPC8315平台上的移植
- linux计算时间
- Android Activity---协调Activity
- 使用方法
- WPF使用资源绑定自定义类型
- xml schema中如何定义Map类型
- Android Fragment---概要介绍
- JXL操作Excel
- 移植u-boot-2010.09到S3C2440(五)—— 通过OPENJTAG、OPENOCD、ECLIPSE进行调试
- Microsoft Office MIME Types
- Illegal scheme supplied, only alphanumeric characters are permitted【1.2】
- Linux下Tomcat占用JVM内存数修改及监控