DCOM D-Mystified:DCOM教程,第4步





5.00/5 (5投票s)
在这里,我们向DCOM远程对象添加了一个方法,并开始实现其功能。
引言
欢迎来到DCOM教程的第4步。在本系列教程中,我将通过一个简单易懂的示例,全面讲解DCOM,以消除其神秘感、头痛和困惑。好吧,不敢保证——但我会尽力而为。
如果你想跟随本教程,并在此过程中添加代码并使用Visual C++向导,那太好了。事实上,我强烈推荐这样做,否则本教程将是电子墨水的巨大浪费(?)。然而,我在编写教程时,也严格按照教程进行,并像我说的那样使用Visual C++向导来开发代码。屏幕截图实际上是我为每个步骤开发文件时截取的!要下载这些已开发的代码以与您自己的代码进行比较,只需点击每一步顶部的“下载第n步文件 - n KB”链接。在教程的问题与解答页面,还有一个所有步骤文件存档。我仍然建议您跟随我们一起学习;这样,您可以在编码的同时学习。如果您在此过程中遇到任何问题,请随时
- 发送电子邮件给我:brian@harttechservices.com。
- 在此页面底部的留言板上发帖。
- 查看本教程的问题和解答页面。
请记住,本教程中我们开发软件的步骤如下:
- 第 1 步:使用 ATL COM AppWizard 创建服务器
HelloServ
。 - 第 2 步:修改 AppWizard 提供的启动文件。
- 第 3 步:使用 New ATL Object Wizard 向服务器添加一个简单的 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)) { // Display the cause of the error to the user with the _com_error class // To use the _com_error class, you need to #include <comdef.h> in // your STDAFX.H file AfxMessageBox(_com_error(GetLastError()).ErrorMessage(), MB_ICONSTOP); return /*whatever error code: -1 or E_FAIL or whatnot here*/; } // Now szComputerName holds this computer's name**列表1。** 调用
GetComputerName()
函数。现在,让我们添加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() { // Get the network name of this computer TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; if (!GetComputerName(szComputerName, &dwSize)) return E_FAIL; // failed to get the name of this computer // TODO: Add more code here return S_OK; }**列表2。** 添加代码实现
SayHello()
方法。后记
注意那行写着// TODO: Add more code here
?这告诉我们还没有完成实现;根据设计,此方法应该向客户端触发某种事件。要了解如何做到这一点,请单击“下一步”进入第5步,在那里我们将完成服务器的实现,并准备转向客户端。要转到上一步,第3步,请单击下面的“上一步”。如果您有疑问,请尝试单击“问题与解答”进入一个可能对您有帮助的页面。