1、注销操作:RegSvr32 /u c:XXXXX.dll注册操作:RegSvr32 c:在运行客户程序前,必须先注册组件程序。5.写出上机实验报告。实验报告格式1.画出实验所设计的COM组件的结构2.关键代码(1)组件部分的关键代码idl文件内COM对象和接口的关键定义代码C+文件中成员函数的关键实现代码(2)客户端测试程序中组件调用部分的关键代码3.实验结果COM试验参考一、建立ATL工程( 注意:和试验任务书要求的组件结构不同)IMathAdd(long n1, long n2, long * pnVal)Cat(BSTR s1, BSTR s2, BSTR *psVal)步骤1:建立一个
2、工作区(WorkSpace)。步骤2:在工作区中,新建一个ATL工程(Project)。命名为SimpleCom(如图1),并选择DLL方式(如图2)。图1 新建ATL工程图2 选择DLL类型说明:Dynamic Link Library(DLL) 表示建立一个 DLL 的组件程序。Executable(EXE) 表示建立一个 EXE 的组件程序。Service(EXE) 表示建立一个服务程序,系统启动后就会加载并执行的程序。Allow merging of proxy/stub code 选择该项表示把“代理/存根”代码合并到组件程序中,否则需要单独编译,单独注册代理存根程序。Support
3、 MFC 支持MFCSupport MTS 支持事务处理,即是否支持 COM+ 功能。二、增加ATL对象类步骤3:选择菜单 InsertNew ATL ObjectObject 分类Simple Object 项目。见图3。图3 选择建立简单COM对象Category Object 普通组件。其中可以选择的组件对象类型很多,但本质上,就是让向导帮忙加上一些默认接口。Category Controls ActiveX 控件。其中可以选择的 ActiveX 类型也很多。Category Miscellaneous 辅助杂类组件。Categroy Data Access 数据库类组件。步骤4:增加自
4、定义类 CMath(接口IMath),见图4。图4 输入类中的各项名称步骤5:填写接口属性,见图5。图5 接口属性Threading Model 选择组件支持的线程模型。Interface 接口基本类型。Dual 表示支持双接口;Custom 表示自定义借口。Aggregation是否允许被别人聚合使用。No表示不聚合。Support ISupportErrorInfo 是否支持丰富信息的错误处理接口。Support Connection Points 是否支持连接点接口(事件、回调)。Free Threaded Marshaler三、添加接口成员函数图6 调出增加接口方法的菜单图7 增加接口
5、函数 Addin表示参数方向是输入;out表示参数方向是输出;out,retval表示参数方向是输出,同时可以作为函数运算结果的返回值。一个函数中,可以有多个in、out,但retval只能有一个,并且要和out组合后在最后一个位置。图8 接口函数实现代码如下:STDMETHODIMP CMath: / TODO: Add your implementation code here* pnVal = n1 + n2; return S_OK;四、添加第二个接口IStr。完成上述步骤后,打开IDL文件(双击IMath接口),手工添加代码,其中UUID每个组件,每个接口都会不同。/引入IUnkno
6、wn和ATL已经定义的其它接口描述文件。import oaidl.idl;ocidl.idl/接口的完整描述 object, /表示本块描述的是一个接口 uuid(E34275D2-B3CA-4BCA-9AC7-0713ABE2F876), helpstring(IMath Interface), /说明文字 pointer_default(unique) /定义接口函数中参数所使用指针的默认属性 interface IMath : IUnknown /接口叫 IMathe 派生自 IUnknown /接口函数列表 helpstring(method Add) HRESULT Add(in l
7、ong n1, in long n2, out,retval long * pnVal); ;/增加接口代码 object, uuid(36A75A3F-94DE-47fe-AF51-0C0C65316A03), / 手工产生的 IID IStr Interface), pointer_default(unique) interface IStr : IUnknown /新建接口 / 目前还没有任何接口函数/增加接口代码结束/类型库的完整描述 uuid(FBF0BE44-9E98-4189-809B-BEC4B67866CC), version(1.0), helpstring(SimpleC
8、om 1.0 Type Library)library SIMPLECOMLib /#import 时候的默认命名空间 importlib(stdole32.tlb);stdole2.tlb uuid(9D4F4C3B-A41F-4A3A-9FF2-F8784DBE2CC5), /组件的 CLSIDMath Class coclass Math/接口列表 default interface IMath; /default表示接口IMath提供了IUnknown接口 interface IStr; /在接口列表中添加新接口;其中手工产生GUID可借助于vc目录CommonToolsGuidGen
9、.exe程序。五、打开头文件(Math.h),手工增加类的派生关系和接口入口表 ,然后保存。#ifndef _MATH_H_#define _MATH_H_#include resource.h / main symbols/ CMathclass ATL_NO_VTABLE CMath : public CComObjectRootEx, public CComCoClass public IMath, /增加一个分隔符逗号 public IStr /增加一个基类public: CMath() DECLARE_REGISTRY_RESOURCEID(IDR_MATH)DECLARE_NOT_
10、AGGREGATABLE(CMath)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CMath) COM_INTERFACE_ENTRY(IMath) COM_INTERFACE_ENTRY(IStr) /增加新接口到接口入口表END_COM_MAP()/ IMath STDMETHOD(Add)(/*in*/ long n1, /*in*/ long n2, /*out,retval*/ long * pnVal);#endif /_MATH_H_六、为IStr接口增加一个字符串连接功能的函数。图9 添加接口函数CatCComBSTR sRes
11、ult( s1 ); sResult.AppendBSTR( s2 ); *psVal = sResult.Copy();七、编译DLL按下F7键,编译器工作片刻后就会在注册表中注册你的新DLL了,这样一来其它的程序就可以使用它了。图9 编译dll八、在Visual C+中新建工程,编写客户端程序,进行组件测试。新建工程。选择“Win32 Console Application”,起名为“TestCom”,在下一个窗口中单击OK按钮接受所有默认值,最后单击Finish按钮。新建文件新建“C+ Source File”文件并命名为“TestCom.cpp”,单击OK接受。在空白文件中添加一些代码
12、来测试COM服务器。代码如下:.SimpleComSimpleCom.h /指明工程路径,引用头文件.SimpleComSimpleCom_i.c /各GUID在xxx_i.c文件中#include /输入输出comutil.h /字符串类型转换comdef.hvoid main(void)HRESULT hr;IUnknown *pUnknown;IMath *IMathAdd = NULL;IStr *IStrCat = NULL;GUID MathCLSID;hr = CoInitialize(0); /COM库初始化if(hr=S_OK) hr=:CLSIDFromProgID(LSi
13、mpleCom.Math.1,&MathCLSID); hr = CoCreateInstance( MathCLSID, NULL, CLSCTX_INPROC_SERVER,IID_IUnknown, (void*) &pUnknown); if(hr=S_OK) hr=pUnknown-QueryInterface(IID_IMath,(void *)&IMathAdd); if(hr=S_OK) long ReturnValue; IMathAdd-Add(5, 7, &ReturnValue); cout The answer for 5 + 7 is: ReturnValue Cat(SysAllocString (LMiddleWare),SysAllocString(LTechnology), &CatString);MiddleWare+Technology: _bstr_t(CatString) SysFreeString(CatString);else cout CoCreateInstance Failed. CoUninitialize();第3步:编译并运行程序按下F5键来编译程序,然后按下Ctrl+F5运行。图13 运行结果
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2