65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2000 年 8 月 7 日

CPOL
viewsIcon

160849

downloadIcon

1945

在这里,我们向DCOM远程对象添加了一个方法,并开始实现其功能。

引言

欢迎来到DCOM教程的第4步。在本系列教程中,我将通过一个简单易懂的示例,全面讲解DCOM,以消除其神秘感、头痛和困惑。好吧,不敢保证——但我会尽力而为。

如果你想跟随本教程,并在此过程中添加代码并使用Visual C++向导,那太好了。事实上,我强烈推荐这样做,否则本教程将是电子墨水的巨大浪费(?)。然而,我在编写教程时,也严格按照教程进行,并像我说的那样使用Visual C++向导来开发代码。屏幕截图实际上是我为每个步骤开发文件时截取的!要下载这些已开发的代码以与您自己的代码进行比较,只需点击每一步顶部的“下载第n步文件 - n KB”链接。在教程的问题与解答页面,还有一个所有步骤文件存档。我仍然建议您跟随我们一起学习;这样,您可以在编码的同时学习。如果您在此过程中遇到任何问题,请随时

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

  • 第 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**中所示的相同。

Adding the SayHello method to the IHelloWorld interface.
**图1。** 向IHelloWorld接口添加SayHello()方法。

单击“确定”。这样做后,“添加方法到接口”对话框将在所有正确的位置添加代码,以确保当通过网络调用IHelloWorld::SayHello()方法时,CHelloWorld::SayHello()成员函数将被调用并执行。添加方法后,ClassView应类似于下面**图2**中所示。

ClassView after the SayHello method has been added.
**图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步,请单击下面的“上一步”。如果您有疑问,请尝试单击“问题与解答”进入一个可能对您有帮助的页面。

<< 上一步 | 下一步 >>

问答

© . All rights reserved.