ATL/COM简单工程

2016-02-19 16:40 1 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的ATL/COM简单工程,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  介绍

  本教程的目的是告诉你如何使用ATL创建一个COM服务器,并使用Visual C++和Visual Basic程序来分别调用这个服务器。我并不想深入探讨COM的细节,也不想让你深陷于IDL之中。这一教程只是为VC++的新手程序员设计的,告诉他们利用ATL来创建一个COM对象有多么简单,并让他们能对ATL产生更多的兴趣。

  第1步:启动ATL COM Wizard

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

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

  请确认你能在VC++的IDE中看到Workspace View,如果不能的话则请单击View菜单,然后选择Workspace。在这个视图中你会看到三个选项卡,请单击ClassView栏,你应该会看到Simple_ATL Classes。请在此右击鼠标键,并在弹出菜单中选择New ATL Object,你将会看到下面这样的窗口:

  默认的选择项Simple Object就是我们所要的了,请单击next按钮,你会来到ATL Object Wizard Properties窗口中。在Short Name文本框中输入First_ATL。请注意,这时候向导就会自动地填写其它的文本框。然后,单击顶部的Attributes标签,在这里你需要做一些选择。第一项线程模型(Threading Model)的选择,我们选择默认的单元(Apartment)模型。对于接口(Interface),我们选择双重(Dual)。最后,因为我们的程序与聚合(Aggregation)无关,所以我们选择No的单选按钮。你不必关心底部的三个复选框,直接单击OK就可以了,这时候向导就会为我们创建一个新的ATL简单对象。

  第3步:添加一个方法

  如果你现在在工作区中单击了ClassView标签,那么你会注意到向导在其中添加了一串东西。我们想添加的第一个东西是一个方法,可以在IFirst_ATL上右击鼠标键,并选择Add Method。

  一旦你单击了Add Method之后,你就会看到Add Method to Interface窗口。在返回值类型(Return Type)处你会看到,这个方法会默认返回HRESULT,在大多数情况下你不需要改变它。下一个文本框允许我们输入方法的名称,我们可以输入AddNumbers。最后一个文本框是让我们输入参数的,由于我们想做两个数的相加并获得一个返回的结果,所以我们需要三个参数,并且最后一个参数是一个指针。现在,我们不必看那关于IDL的300页教程了,可以直接在参数文本框中输入:

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

本文示例代码或素材下载

  第4步:编译DLL

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

  第5步:在Visual Basic中测试COM服务器

  那么,先让我们用VB来测试这个COM服务器吧。(如果你没有VB的话,你可以跳过这一节,直接在VC++中测试。)启动VB,并选择标准EXE(Standard EXE)建立工程,并在对话框上放置一个命令按钮。现在,我们需要添加COM服务器的引用,请单击工程(Project)菜单并选择引用(References),找到Simple ATL 1.0 Type Library并选择它。

  单击确定(OK)按钮之后,你可以双击先前放置的命令按钮,VB会切换到这个按钮的代码窗口。添加以下的代码:

  

Private Sub Command1_Click()  Dim objTestATL As SIMPLE_ATLLib.First_ATL  Set objTestATL = New First_ATL  Dim lngReturnValue As Long  objTestATL.AddNumbers 5, 7, lngReturnValue  MsgBox "The value of 5 + 7 is: " & lngReturnValue  Set objTestATL = NothingEnd Sub

  如果你是个VB的程序员,那么这些代码对于你是很直观的:我们声明了一个对象,并从COM服务器调用AddNumbers的方法,然后显示结果。现在按下F5来运行这个VB工程,单击命令按钮,你就会看到期望的结果了:

  并不是很难吧?那么我们再来一次,这一次用VC++。

  第6步:在Visual C++中测试COM服务器

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

  

// 你需要指明Simple_ATL工程的路径来引用这个头文件#include "..Simple_ATLSimple_ATL.h"#include iostream.h// 把以下的内容从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();}

  第7步:编译并运行程序

  现在你可以按下F5键来编译程序,然后按下Ctrl+F5来运行之。你应该可以看到一个DOS窗口,给出了你所期望的结果。

本文示例代码或素材下载

来源:https://www.tulaoshi.com/n/20160219/1612703.html

延伸阅读
标签: 生活常识
金融工程师通常受雇于投资银行、商业银行、证券公司、各种各样的其他金融中介机构以及非金融性质的公司。因为金融工程师掌握一系列专业化的、仅凭技术所无法达到的素质,并且,由于金融创新的速度超过了市场产生称职金融工程师的能力,金融工程师总体上是供不应求,就业前景光明。在华尔街,一个优秀的金融工程师可获得50万美金的年薪。 ...
认识AAuto工程文件   在中点击, 然后点击鼠标右键,在中点击,如下图: 在中打开了工程文件在上的目录,如下图: default.aproj 是AAuto工程文件 - 存储了工程的所有配置属性、工程包含的目录文件等,实际上这是一个文本文件,使用记事本可以打开编辑(不过建议新手还是不要手动编辑此文件)。 也可以直接...
《文明5》大型工程 所谓的大型工程其实就是一个在城市里建造,但是又不能通过牺牲伟人和花钱来提速的东西。只能通过自身城市的产能来一点点研发。4代里的大型工程是一人研发,全球受益,而且可以组队研究。5代里面变成了各自研究各自的,当然最后的成果也是自己独享的。 说到底,这一代的大型工程其实就3项:阿波罗计划、乌托邦工程、曼哈顿工程...
标签: PHP
  找了很久,终于给我找到!哈哈哈...   //听说php4也已经支持Java/EJB的说.   <?   // this script is come from zend. :)   $word = new COM("word.application") or die("Unable to instanciate Word   ");    print "Loaded Word, versi...

经验教程

974

收藏

71
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部