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

DCOM D-Mystified.NET 2003:DCOM 教程,第 4 步

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.80/5 (6投票s)

2005年12月30日

CPOL

6分钟阅读

viewsIcon

36144

downloadIcon

293

向服务器添加一个 SayHello() 方法,该方法会触发客户端处理的事件。

引言

欢迎来到 DCOM 教程的第 4 步。在本系列中,我将通过一个全面的教程和直接的示例,剥离 DCOM 的神秘感、令人头痛的问题和困惑。好吧,我不敢保证——但我会尽力而为。

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

  • 在此页面底部的留言板上发帖。
  • 查看本教程的问答页面 - 即将推出。

我们的软件最终如何工作的图示见图 1。客户端调用服务器上的一个方法,然后服务器使用连接点将事件触发回客户端。此连接点的事件接收器在客户端(使用 MFC 和类向导!!!)中实现,客户端向其用户显示一条消息,告知用户服务器说“Hello!”。

图 1. 我们的 DCOM 客户端/服务器设置图。

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

  • 第 1 步:使用 ATL 项目向导创建服务器,HelloWorldServ.NET
  • 第 2 步:修改 ATL 项目向导提供的起始文件。
  • 第 3 步:向服务器添加一个简单的 ATL 对象 HelloWorld,以暴露我们的功能。
  • 第 4 步:向服务器添加一个方法 SayHello(),该方法会触发客户端处理的事件。
  • 第 5 步:我们查看连接点并设置服务器端的连接点。
  • 更多步骤即将推出!

我们目前正在教程的第 4 步,我们将最终把工作代码添加到我们的 DCOM 服务器。我们将向 IHelloWorld 接口添加一个方法,并将其命名为 SayHello()。此方法将获取其执行所在主机的网络名称,然后将事件触发回客户端。好了,我的废话够多了;让我们深入了解。

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

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

// receptacle for the computer's name
TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 
// size of the computer's name
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() 方法,然后添加其代码。首先,为了生成“添加方法向导”所需的文件,请构建项目。接下来,转到“类视图”。然后点击“+”号展开 CHelloWorld 类,然后点击“+”号展开“基类和接口”图标,并对 IHelloWorld 接口图标执行相同的操作。然后,双击 IHelloWorld 接口图标。这会使 Visual C++ .NET 2003 生成添加方法所需的文件。接下来,右键单击 IHelloWorld 接口图标,指向“添加”,然后单击“添加方法”,如下面的图 2 所示。

图 2. 使用类视图向类添加新方法。

“添加方法向导”出现,如下图 3 所示。在“方法名称”框中键入 SayHello,并将“返回类型”保留为 HRESULT (好吧,这没什么大不了的,因为现在开发环境不给你选择的余地!)。

图 3. 使用“添加方法向导”向 IHelloWorld 添加 SayHello() 方法。

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

单击“完成”。完成后,“添加方法向导”将把代码添加到所有正确的位置,以确保当通过网络调用 IHelloWorld::SayHello() 方法时,CHelloWorld::SayHello() 成员函数将被调用和执行。添加方法后,“类视图”应类似于下面图 4 所示的视图。

图 4. 添加 SayHello() 方法后的类视图。

看图 4。看到高亮显示的项目了吗?在“类视图”中双击该项目以打开 CHelloWorld::SayHello() 成员函数。此函数实现了 IHelloWorld::SayHello() 方法。让我们添加一些代码(在**列表 2** 中以**粗体**显示)来实现该方法。

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))
        // failed to get the name of this computer
        return E_FAIL;    

    // TODO: Add more code here

    return S_OK;
}
列表 2. 添加代码以实现 SayHello() 方法。

幕后笔记

注意到那行写着 // TODO: 在此处添加更多代码 吗?这告诉我们我们还没有完成实现;根据设计(如上图 1 所示),这个方法应该向客户端触发某种事件。要了解如何做到这一点,请点击**下一步 >>** 进入第 5 步,在那里我们完成服务器的实现并准备好转向客户端。要返回上一步(第 3 步),请点击下面的**<< 返回**。如果你有问题,请尝试点击**问题和答案**(即将推出!),进入一个可能对你有帮助的页面。

<< 返回 | 下一步 >>
问答 - 即将推出!

提示:如果你遇到问题或无法理解某些内容,通常是你在此教程中没有彻底跟进,就直接下载了最新步骤的代码。也许如果你回到前面的步骤,并在不清楚的地方重新学习教程,这可能会有所帮助。此外,也可能是因为还有更多步骤尚未编写!敬请关注!

提示:另外,如果您有问题,请将其发布到下面的留言板上,该留言板位于本文底部。您发布后我将收到一封电子邮件,然后每个人都可以看到您的问题和我的回答。也不要忘记给本文评分!如果您给的分数低于 5 分,请在留言板上说明原因,以便我能为每个人改进这些文章。

© . All rights reserved.