DCOM 揭秘:DCOM 教程,第三步






4.86/5 (7投票s)
在此步骤中,我们将使用新的 ATL 对象向导在服务器中添加一个简单的 COM 对象。
引言
欢迎来到我们的 DCOM 教程第三步。在本系列教程中,我将通过一个简单的例子,消除 DCOM 的神秘感、烦恼和困惑。好吧,不敢保证——但我会尽力而为。
如果您想跟随本教程学习,并在进行过程中添加代码并使用 Visual C++ 向导,那太好了。事实上,我非常非常强烈地推荐这样做,否则本教程就是电子墨水(?)的浪费。不过,我在编写教程的同时,也严格按照教程进行,开发代码并使用 Visual C++ 向导,就像我告诉您应该做的那样。截图事实上就是我为每一步开发文件时生成的!要下载这些已开发好的代码以与您自己的代码进行比较,只需点击每一步顶部的“下载第 n 步文件 - n KB”链接。在本教程的问答页面上,还有一个包含所有步骤文件的存档。我仍然建议您与我们一起学习;这样,您就可以在编码的同时学习。如果您在本教程学习过程中遇到任何问题,请随时
- 发送电子邮件给我:brian@harttechservices.com。
- 在此页面底部的留言板上发帖。
- 查看本教程的问题和解答页面。
图 1 展示了我们的软件最终将如何工作的示意图。客户端调用服务器上的方法,然后服务器通过连接点向客户端触发一个事件。此连接点的事件接收器是在客户端实现的(使用 MFC 和类向导!!!),客户端向用户显示一条消息,告知用户服务器说了“你好!”
图 1。 我们的 DCOM 客户端/服务器设置示意图。
请记住,本教程中我们开发软件的步骤如下:
- 第 1 步:使用 ATL COM AppWizard 创建服务器
HelloServ
。 - 第 2 步:修改 AppWizard 提供的启动文件。
- 第 3 步:使用 New ATL Object Wizard 向服务器添加一个简单的 COM 对象,即
HelloWorld
对象。 - 第 4 步:修改
IHelloWorld
接口以包含SayHello()
方法。 - 第 5 步:向连接点源接口
DHelloWorldEvents
添加一个事件方法OnSayHello()
。 - 第 6 步:构建服务器,并在服务器计算机上安装它。
- 第 7 步:创建一个 MFC 客户端
HelloCli
,该客户端调用服务器并处理连接点事件接收器。
我们目前正在进行本教程的第三步,在此我们将使用 ATL 对象向导向服务器添加一个简单的 COM 对象,即 HelloWorld
对象。这一步会很快完成,所以,与其继续我喋喋不休地讲下去,不如让我们开始吧。
第三步:向服务器添加一个简单的 HelloWorld
COM 对象
要向 ATL 服务器添加 COM 对象,我们可以使用 Visual C++ 提供的新的 ATL 对象向导,或者手动添加代码。我倾向于尽可能使用 Visual C++ 提供的向导,但那是懒惰的我 :)
让我们继续。打开类视图,然后右键单击最顶部的“HelloServ classes”文本,然后在菜单中选择“New ATL Object”。此时将出现“New ATL Object Wizard”,如下图图 2 所示。在本教程中,我们只需要一个简单的 COM 对象,所以点击“Simple COM Object”图标,然后点击“Next”。
图 2。 显示已选择“Simple COM Object”的“New ATL Object Wizard”。
点击“Next”后,应出现“ATL Object Wizard Properties”对话框。光标默认位于“Short Name”文本框中。在此框中键入 HelloWorld
;当您输入时,其他字段会自动填充。如下图图 3 所示,完成后一切都应如您所见。但此时不要点击 OK!
图 3。 已填入“Names”选项卡的“ATL Object Wizard Properties”对话框。
现在,点击“ATL Object Wizard Properties”对话框的“Attributes”选项卡。进行以下选择:
- 在“Threading Model”下,选择“Apartment”。
- 在“Interface”下,选择“Custom”。
- 在“Aggregation”下,选择“No”。
- 勾选“Support Connection Points”复选框。
当所有设置都正确后,“Attributes”选项卡应显示如下图图 4 所示。准备就绪后,点击 OK,让“New ATL Object Wizard”为我们生成代码并将我们的新 COM 对象添加到服务器。
图 4。 更改设置后,“ATL Object Wizard Properties”对话框的“Attributes”选项卡。
添加完成后,类视图应如下图图 5 所示。但我们还需要做最后一个更改。请注意,在图 5 中,事件接口(用于连接点)的名称不是 _IHelloWorldEvents
,而是 DHelloWorldEvents
?这是我修改代码的一个小改动的结果。
图 5。 添加 HelloWorld
对象并更改事件接口名称后的类视图。
我们的事件接口的 DHelloWorldEvents
名称是微软的一个松散约定,我正在遵循它。DHelloWorldEvents
是一个 dispinterface
,所以在其名称前有一个 D。明白了吗?很好。在类视图中双击 _IHelloWorldEvents
图标。这将跳转到项目 IDL 源代码,其中声明了我们项目使用的所有 OLE 东西。接下来,替换 Listing 1 中以粗体显示的 _IHelloWorldEvents
的所有实例,并将它们更改为Listing 2 中以粗体显示的 DHelloWorldEvents
。
[ ... ] library HELLOSERVLib { importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(...), helpstring("_IHelloWorldEvents event interface") ] dispinterface _IHelloWorldEvents { ... }; [ uuid(...), helpstring("HelloWorld Class") ] coclass HelloWorld { [default] interface IHelloWorld; [default, source] dispinterface _IHelloWorldEvents; }; };列表 1。 我们需要用
DHelloWorldEvents
替换的 _IHelloWorldEvents
接口实例。[ ... ] library HELLOSERVLib { importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(...), helpstring("DHelloWorldEvents event interface") ] dispinterface DHelloWorldEvents { ... }; [ uuid(...), helpstring("HelloWorld Class") ] coclass HelloWorld { [default] interface IHelloWorld; [default, source] dispinterface DHelloWorldEvents; }; };列表 2。 将
_IHelloWorldEvents
名称替换为 DHelloWorldEvents
。后记
就是这样!第三步完成!看,这并不难,对吧?在对 IDL 源代码进行了上面两个列表中指定的更改后,点击 Visual C++ 工具栏上的“Save All”。这将保存您所有项目文件的更改,并且类视图应与图 5 匹配。
您现在可以继续进行第四步。要做到这一点,您可以点击此句前面的链接,或点击下面的“Next”。您可以在上面的下载链接中找到本教程此步骤的源代码。要返回本教程的第二步,请点击下面的“Back”。