DCOM教程:创建和使用COM对象

本教程旨在揭开DCOM的神秘面纱,消除头痛和困惑,通过一个简单的例子为提供全面的指导。虽然不能保证什么,但会尽力而为。如果想跟随本教程添加代码并使用Visual C++向导,那太好了。事实上,非常非常推荐这样做,因为否则这个教程就是电子墨水的浪费。跟随教程的每一步,编写代码并使用Visual C++向导,就像建议做的那样。截图实际上是为每一步开发的文件的截图!要下载已经开发好的代码以与自己的代码进行比较,只需点击每个步骤顶部的“下载步骤文件 - n KB”链接。教程的问答页面还有一个所有步骤文件的存档。仍然建议跟随进行;这样,可以在编码的同时学习。如果在教程过程中遇到问题,请随时:

  • 发送电子邮件至brian@harttechservices.com。
  • 在本页底部的留言板上发布消息。
  • 查看教程的问答页面。

请记住,在本教程中开发软件的步骤如下:

  1. 使用ATL COM AppWizard创建服务器HelloServ。
  2. 修改AppWizard提供的起始文件。
  3. 使用新的ATL对象向导向服务器添加一个简单的COM对象HelloWorld对象。
  4. 修改IHelloWorld接口以包含SayHello()方法。
  5. 向连接点源接口DHelloWorldEvents添加事件方法OnSayHello()。
  6. 构建服务器,并在服务器计算机上安装。
  7. 创建MFC客户端HelloCli,该客户端调用服务器并处理连接点事件接收器。

目前在教程的第4步,将为DCOM服务器添加工作代码。将向IHelloWorld接口添加一个方法,并称之为SayHello()。这个方法将获取它正在执行的主机的网络名称,并且它将调用尚未实现的函数Fire_OnSayHello(),在第5步将将其作为事件添加到DHelloWorldEvents事件接口。这个函数将接受一个[in] BSTR参数,即主机的名称。无论如何,不要再啰嗦了;让开始吧:

第4步:修改IHelloWorld接口以添加SayHello()方法

本教程的这一步非常短。所要做的就是向ISayHello接口添加一个方法,并使用CHelloWorld ATL类实现它。然后将准备好进入第5步!由于客户端用户希望对他们的网络上运行此代码的计算机有所了解,将添加一些代码来获取该计算机的网络名称。以下代码,列表1,可以将其复制并粘贴到希望的任何应用程序中。这段代码调用了Windows的GetComputerName()函数:

TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; if (!GetComputerName(szComputerName, &dwSize)) { // 使用_com_error类向用户显示错误原因 // 要使用_com_error类,需要在STDAFX.H文件中#include AfxMessageBox(_com_error(GetLastError()).ErrorMessage(), MB_ICONSTOP); return /* 任意错误代码:-1或E_FAIL或其他 */ ; } // 现在szComputerName包含这台计算机的名称

现在让添加IHelloWorld::SayHello()方法,然后添加它的代码。要做到这一点,右键单击ClassView中的IHelloWorld接口图标,然后单击“添加方法”。将出现“向接口添加方法”对话框。在“方法名称”框中键入SayHello,并保留返回类型为HRESULT。

提示:在进行DCOM编程并向接口添加方法时,*总是*将方法的返回类型设置为HRESULT。这允许DCOM向客户端报告网络错误和其他状态。

无论如何,回到正在做的事情,当完成填写“向接口添加方法”对话框时,它应该看起来像下面图1所示:

图1。向IHelloWorld接口添加SayHello()方法。

点击确定。当这样做时,“向接口添加方法”对话框将添加代码到所有正确的地方,以确保当对IHelloWorld::SayHello()方法的调用通过线路进来时,CHelloWorld::SayHello()成员函数将被调用并执行。添加方法后,ClassView应该看起来像下面图2所示:

图2。添加SayHello()方法后的ClassView。

看图2。看到突出显示的项目了吗?双击ClassView中的该项目,打开CHelloWorld::SayHello()成员函数。这个函数实现了IHelloWorld::SayHello()方法。让添加一些代码,如下所示:

STDMETHODIMP CHelloWorld::SayHello() { // 获取这台计算机的网络名称 TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; if (!GetComputerName(szComputerName, &dwSize)) return E_FAIL; // 未能获取这台计算机的名称 // TODO: 在这里添加更多代码 return S_OK; }

列表2。实现SayHello()方法的代码。

|
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485