本教程旨在揭开DCOM的神秘面纱,消除头痛和困惑,通过一个简单的例子为提供全面的指导。虽然不能保证什么,但会尽力而为。如果想跟随本教程添加代码并使用Visual C++向导,那太好了。事实上,非常非常推荐这样做,因为否则这个教程就是电子墨水的浪费。跟随教程的每一步,编写代码并使用Visual C++向导,就像建议做的那样。截图实际上是为每一步开发的文件的截图!要下载已经开发好的代码以与自己的代码进行比较,只需点击每个步骤顶部的“下载步骤文件 - n KB”链接。教程的问答页面还有一个所有步骤文件的存档。仍然建议跟随进行;这样,可以在编码的同时学习。如果在教程过程中遇到问题,请随时:
请记住,在本教程中开发软件的步骤如下:
目前在教程的第4步,将为DCOM服务器添加工作代码。将向IHelloWorld接口添加一个方法,并称之为SayHello()。这个方法将获取它正在执行的主机的网络名称,并且它将调用尚未实现的函数Fire_OnSayHello(),在第5步将将其作为事件添加到DHelloWorldEvents事件接口。这个函数将接受一个[in] BSTR参数,即主机的名称。无论如何,不要再啰嗦了;让开始吧:
本教程的这一步非常短。所要做的就是向ISayHello接口添加一个方法,并使用CHelloWorld ATL类实现它。然后将准备好进入第5步!由于客户端用户希望对他们的网络上运行此代码的计算机有所了解,将添加一些代码来获取该计算机的网络名称。以下代码,列表1,可以将其复制并粘贴到希望的任何应用程序中。这段代码调用了Windows的GetComputerName()函数:
TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
if (!GetComputerName(szComputerName, &dwSize)) {
// 使用_com_error类向用户显示错误原因
// 要使用_com_error类,需要在STDAFX.H文件中#include
AfxMessageBox(_com_error(GetLastError()).ErrorMessage(), MB_ICONSTOP);
return /* 任意错误代码:-1或E_FAIL或其他 */ ;
}
// 现在szComputerName包含这台计算机的名称
现在让添加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() {
// 获取这台计算机的网络名称
TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
if (!GetComputerName(szComputerName, &dwSize))
return E_FAIL;
// 未能获取这台计算机的名称
// TODO: 在这里添加更多代码
return S_OK;
}
列表2。实现SayHello()方法的代码。
|