创建COM组件以及COM接口流程

来源:互联网 发布:淘宝vr购物体验 编辑:程序博客网 时间:2024/05/25 23:27

第1步:启动ATL COM Wizard

你所需要做的第一件事情就是启动VisualC++并创建一个新的工程,选择“ATL COMWizard”,工程名为“Simple_ATL”。设置好工程的路径之后,单击OK按钮。你会看到,屏幕上给了你若干选项。第一个选项为“ServerType”。我们将要创建一个服务器DLL,所以请确认服务器的类型选为“Dynamic LinkLibrary”。我们并不需要关心下面的其它三个复选框,所以我们可以将它们忽略掉。按下Finish按钮,这样向导就会为你产生适当的文件了。之后,一个“New ProjectInformation”窗口就会出现,你可以从上面得知向导都会创建什么文件,按下“OK”接受这一切。

第2步:创建一个新的ATL对象

请确认你能在VC++的IDE中看到WorkspaceView,如果不能的话则请单击“View”菜单,然后选择“Workspace”。在这个视图中你会看到三个选项卡,请单击“ClassView”栏,你应该会看到“Simple_ATLClasses”。请在此右击鼠标键,并在弹出菜单中选择“New ATL Object”,默认的选择项“SimpleObject”就是我们所要的了,请单击next按钮,你会来到“ATL ObjectWizard Properties”窗口中。在“ShortName”文本框中输入“First_ATL”。请注意,这时候向导就会自动地填写其它的文本框。然后,单击顶部的“Attributes”标签,在这里你需要做一些选择。第一项线程模型(ThreadingModel)的选择,我们选择默认的单元(Apartment)模型。对于接口(Interface),我们选择双重(Dual)。最后,因为我们的程序与聚合(Aggregation)无关,所以我们选择“No”的单选按钮。底部的三个复选框最好都选上,直接单击OK就可以了,这时候向导就会为我们创建一个新的ATL简单对象。

 

第3步:添加一个方法

如果你现在在工作区中单击了“ClassView”标签,那么你会注意到向导在其中添加了一串东西。我们想添加的第一个东西是一个方法,可以在“IFirst_ATL”上右击鼠标键,并选择“Add Method”。一旦你单击了“AddMethod”之后,你就会看到“Add Method toInterface”窗口。在返回值类型(ReturnType)处你会看到,这个方法会默认返回HRESULT,在大多数情况下你不需要改变它。下一个文本框允许我们输入方法的名称,我们可以输入“AddNumbers”。最后一个文本框是让我们输入参数的,由于我们想做两个数的相加并获得一个返回的结果,所以我们需要三个参数,并且最后一个参数是一个指针。现在,我们不必看那关于IDL的300页教程了,可以直接在参数文本框中输入:

[in] long Num1, [in] long Num2, [out] long*ReturnVal

简单地说来,我们声明了两个long类型的参数,这两个值是传入的([in]),还有一个最后传出的返回值结果([out])。(你第一次看到这样的东西可能会有些奇怪,但是如果你读了一两本关于COM的书的话,就会觉得亲切多了。)现在就可以单击OK按钮了。然后,单击“ClassView”标签,并展开所有的“+”标志,使得树型视图完全展开。你会在接口(IFirst_ATL)的顶部看到我们的“AddNumbers”方法以及我们给予它的参数。在这个方法上双击鼠标键,并插入以下的代码:

STDMETHODIMP CFirst_ATL::AddNumbers(longNum1,               long Num2, long *ReturnVal){    // TODO: Addyour implementation code here    *ReturnVal =Num1 + Num2;   return S_OK;}


 

第4步:编译DLL

无论你相信与否,你已经拥有一个用ATL编写的COM服务器了!当然,我们还需要编译它。请按下F7键,这样VC++就可以编译了。编译器工作片刻后就会在注册表中注册你的新DLL了,这样一来其它的程序就可以使用它了。让我们来测试一下。

 

第5步:在VisualC++中测试COM服务器

如果你的Simple_ATL工程仍然开着,那么就关了它并创建一个新工程。选择“Win32 Console Application”,起名为“Test_ATL”,在下一个窗口中单击OK按钮接受所有默认值,最后单击Finish按钮。现在,你应该有了一个空工程。那么,按下Ctrl+N为工程加入一个新文件,选择“C++ Source File”并命名为“Test_ATL.cpp”,单击OK接受。你现在应该有了一个打开的空白文件,我们需要在其中添加一些代码来测试COM服务器。代码如下:

// 你需要指明Simple_ATL工程的路径来引用这个头文件#include "..\Simple_ATL\Simple_ATL.h"#include// 把以下的内容从Simple_ATL工程目录的Simple_ATL_i.c文件中复制过来// 注意:你也可以直接包含Simple_ATL_i.c文件,我在此只想清楚地表明这些const常量来自何处以及它们的样子const IID IID_IFirst_ATL =   {0xC8F6E230,0x2672,0x11D3,   {0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};const CLSID CLSID_First_ATL =   {0x970599E0,0x2673,0x11D3,   {0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}};void main(void){    //声明一个HRESULT变量以及一个Simple_ATL接口的指针   HRESULT        hr;   IFirst_ATL     *IFirstATL = NULL;   // 现在初始化COM    hr =CoInitialize(0);   // 使用SUCCEEDED宏来看看我们是否能够获得接口的指针   if(SUCCEEDED(hr))    {       hr = CoCreateInstance( CLSID_First_ATL, NULL,           CLSCTX_INPROC_SERVER,           IID_IFirst_ATL, (void**) &IFirstATL);       // 如果成功了,那么调用AddNumbers方法       // 否则给用户显示一条适当的信息       if(SUCCEEDED(hr))       {           long ReturnValue;           IFirstATL->AddNumbers(5, 7, &ReturnValue);           cout << "The answer for 5 + 7 is: "               << ReturnValue << endl;           IFirstATL->Release();       }       else       {           cout << "CoCreateInstance Failed." << endl;       }    }    //卸载COM   CoUninitialize();}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 预授权撤销错了怎么办 打酒店里小卡片电话被骗怎么办 本科错过了选导师该怎么办 本科导师威胁学生不让毕业怎么办 意向导师名额满了怎么办? 扔的瓶子被限制怎么办 左钝缘支起始部重度狭窄怎么办 吃了抑郁症药困怎么办 如果股票退市持股人怎么办 电信身份信息审核失败怎么办 打完肌肉针肿了怎么办 refa掉了一个球怎么办 左腿比右腿粗怎么办 产妇上火怎么办吃什么下火呢 哺乳期上火怎么办吃什么下火 前扣内衣有点紧怎么办 橱柜做了小10厘米怎么办 一个月宝宝体检胸围35怎么办 月经量少脸上长斑怎么办 下压100上压160怎么办 怎么办去台湾新的驻签 学生去韩国旅游签证怎么办 猪的眼睛赛肿了怎么办 纹眉没有修复霜怎么办 衣服搞到走珠露香水洗不掉怎么办 涂牙膏把脸烧伤怎么办 月经血排不出来怎么办 猫眼角膜掉了一块怎么办 腰酸痛直不起腰怎么办 白血病移植后复发了怎么办 斐讯k2红灯常亮怎么办 洗衣机把烟洗了怎么办 吸烟吸的恶心想吐怎么办 显示双方信息的明细怎么办 电脑关不了机了怎么办 xp系统关不了机怎么办 灯的开关闭不了怎么办 灯的开关按不动怎么办 灯开关按不动了怎么办 灯的开关摁不动怎么办 微信群500人满了怎么办