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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (9投票s)

2005 年 12 月 29 日

CPOL

6分钟阅读

viewsIcon

45860

downloadIcon

356

我们修改了 ATL 项目向导提供的起始文件,以提高用户友好性并为我们的服务器提供安全性。我还将向您展示如何对整个项目进行替换/全部替换操作。

引言

欢迎来到我们的 DCOM 教程第 2 步。在本系列中,我将通过一个全面的教程和直接的示例,揭开 DCOM 的神秘面纱,消除其带来的困扰和困惑。好吧,不作承诺——但我会尽力而为。

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

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

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

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

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

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

我们目前处于教程的第 2 步,我们将修改 ATL 项目向导为我们提供的起始源代码中的一些内容。我们这样做是为了

  • 添加一个用户友好的“服务名称”,以便更轻松地在控制面板中找到我们的服务;
  • 花点时间查看为我们生成的起始文件。
  • 添加代码以正确初始化安全性。

第 2 步:修改 ATL 项目向导提供的起始文件

首先,我们需要为 Windows 提供一个用户友好的名称,以便它向用户显示此服务。这是服务的“服务名称”,当您打开“控制面板”中“管理工具”文件夹下的“服务”图标时,它会列出来。为此,我们将更改 ATL 项目向导生成的起始代码加载的字符串表条目。

接下来要做的就是修改stringIDS_SERVICENAME,以包含我们想要使用的服务名称。图 2,如下所示,说明了如何添加字符串表条目。要完成此操作,请执行以下步骤

  1. 在解决方案资源管理器中,单击资源视图选项卡。
  2. 双击字符串表文件夹将其打开。
  3. 双击文件夹中的字符串表图标以打开字符串表。
  4. 在列表中找到空白条目,然后双击它。属性窗口将出现,如图 2 所示。
  5. 在“ID”框中,输入 IDS_SERVICENAME
  6. 按 Tab 键移动到“标题”框,其中包含 IDS_SERVICENAME 符号在您的代码中映射到的内容。
  7. 在“标题”框中,输入“Hello World.NET Service”,如图 2 所示。
  8. 按 Enter 键。这将把新的字符串表条目保存到字符串表中。

图 2. 通过更改 IDS_SERVICENAME 条目的标题来修改服务名称,使其显示在字符串表中。

上述步骤仅仅是为了演示服务名称的所在地。ATL 项目向导并非以提供世界上最好的名称而闻名,如果您正在设计商业产品的一部分,那么您会希望将服务名称更改为对您的应用程序有意义的名称。

最后,对于这个——相当短的——步骤,我们将正确初始化安全性。这必须通过调用 Win32 函数 CoInitializeSecurity() 来完成。此函数在系统级别配置服务器的安全性。有关具体细节的更多信息,请参阅文档。如果您希望能够在不提供复杂安全信息(即匿名)的情况下运行服务器,则需要调用 CoInitializeSecurity()

要调用 CoInitializeSecurity(),请转到解决方案资源管理器中的类视图,然后单击 CHelloWorldServNETModule 类旁边的 + 号,然后双击 InitializeSecurity(void) 函数。删除函数体中的所有内容,然后添加下面粗体所示的代码,如列表 1 所示

HRESULT InitializeSecurity() throw()
{
    // Turn security off so that
    // everyone has access to us
    HRESULT hResult = CoInitializeSecurity(NULL, -1,
                       NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
                       RPC_C_IMP_LEVEL_IMPERSONATE, NULL,
                       EOAC_NONE, NULL);

    // Return the results so CoInitializeSecurity
    // controls whether this function succeeds or
    // fails

    return hResult;
}
列表 1:通过调用 CoInitializeSecurity() 正确初始化安全性。

事实证明,还有一些东西需要处理。您必须确保常量 _WIN32_WINNT 的值(在 STDAFX.H#define 定义)设置正确。由于我们使用的是 Windows XP,因此需要将其值设置为 0x500。使用解决方案资源管理器打开 STDAFX.H,然后添加列表 2 中所示的代码

#ifndef _WIN32_WINNT        // Allow use of features
                            // specific to Windows XP
                            // or later.

#define _WIN32_WINNT 0x0500 // Change this to the
                            // appropriate value to target
                            // Windows XP or later.
#endif
列表 2:更改 WIN32_WINNT 常量的值以支持 Windows XP 或更高版本中的功能。

幕后笔记

我们现在已经完成了本教程的第 2 步。我们看到了此服务(显示给用户)的名称在哪里初始化,并且我们修复了服务的安全初始化代码。单击下一页 >> 以进入本教程的下一步,即第 3 步;单击<< 返回 以返回本教程的第 1 步;或单击问答链接(即将推出!)以跳转到问答页面。祝您好运。

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

提示:如果您遇到困难或不理解某些内容,通常是因为您只是尽可能地完成了本教程而没有彻底遵循,并下载了最新步骤的代码。也许如果您回到之前的步骤,并在不清楚的地方重新学习教程,这可能会有所帮助。此外,这可能是因为还有更多步骤尚未编写!敬请关注!

提示:此外,如果您有问题,请在下面(本文页面底部)留言板上发布。当您发布时,我将收到一封电子邮件,然后每个人都可以看到您的问题和我的答案。也别忘了评价这篇文章!如果您给了它低于 5 分的评价,请在留言板上说明原因,以便我能为所有人改进这些文章。

© . All rights reserved.