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

CORBA 应用向导 - 简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (12投票s)

2003年11月4日

6分钟阅读

viewsIcon

56774

downloadIcon

2450

一个应用向导,使在控制台和 Windows 应用程序中开始使用 CORBA 更加容易

引言

CORBA 应用程序向导是为像我一样的 CORBA 初学者程序员准备的。该应用程序向导旨在通过省去总是需要一遍又一遍地输入相同样板代码的繁琐工作(例如,CORBA orb 的初始化)来帮助学习 CORBA。相反,人们可以专注于 CORBA 的更精细的细节。本文主要讨论使用此应用程序向导所需的先决条件。文章结尾有一些实现方法,对于想编写自己应用程序向导的初学者来说可能很有趣。

背景

这个应用程序向导源于大约两年前对 CORBA(公共对象请求代理体系结构)的突然兴趣。在发布了一个关于在 CodeProject 上发布 CORBA 文章的可能性后,并得到回复说我应该写一些文章来开始,我决定这样做。

我开始阅读 Michi Henning 和 Steve Vinoski 的著作 Advanced CORBA Programming with C++,其中设置 ORB 的大部分代码似乎都是样板代码。因此,与其总是编写相同的代码,不如创建这个应用程序向导来为我完成繁重的工作。

警告

这是一个正在进行中的(杰作 ;-))作品!!!

此应用程序向导中的并非所有选项都能正常工作。随着向导的彻底测试以及收到新功能请求,可用的选项将会更改。随着我越来越熟悉和熟练使用 CORBA,我还计划为应用程序向导添加新功能。

在 MFC 或 Win32 应用程序中使用 CORBA 尚未经过测试,因此结果未知。我还没有看到任何使用 CORBA 的 MFC 或 Win32 应用程序的示例,但我的观点是,MFC 应用程序中的 `CDocument` 派生类可能包含 CORBA 的样板代码。

你可能会问,如果应用程序向导尚未完成,我为什么要发布这篇文章。嗯,我一年前就开始开发应用程序向导了,至少这样我才被迫去完成它。

要求和设置

要能够使用此应用程序向导,需要在你的计算机上安装并构建 ACE(ADAPTIVE Communication Environment)和 TAO(The Ace Orb)。ACE 和 TAO 的源代码可以分别从 www.cs.wustl.edu/~schmidt/ACEwww.cs.wustl.edu/~schmidt/TAO 下载。

通过在你的 Autoexec.bat 文件中添加以下行来设置 ACE_ROOTTAO_ROOT 环境变量

  1. SET PATH=%PATH%;E:\ACE_Wrappers\bin
  2. SET ACE_ROOT=E:\ACE_Wrappers
  3. SET TAO_ROOT=E:\ACE_Wrappers\Tao\Tao

完整的安装说明可以在 ACE 和 TAO 的源代码提供的文档中找到。

在从“工具”菜单中选择“选项”后,将出现“选项”对话框。单击“目录”选项卡并显示包含文件的目录。按照下图所示,用红色圈出的目录添加。

然后显示可执行文件的目录,并添加下面突出显示的目录。

其中 E:\ 是保存 ACE 和 TAO 源代码并已构建 ACE 和 TAO 的驱动器。

安装

要安装 CORBA 应用程序向导,只需下载包含 DLL 的 zip 文件,然后解压缩文件并将它们复制到所有其他向导所在的目录,即:

C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Template

入门

选择“新建”对话框的“项目”选项卡后,单击 CORBA AppWizard 并输入一个合适的项目名称。

然后单击 OK 按钮。应用程序向导的第一步将出现。有关如何使用 CORBA 应用程序向导的更详细说明,请参阅教程 使用 CORBA 应用程序向导

关注点

以下是一些对于初次创建应用程序向导的人可能感兴趣的项目。

选项相互依赖

有些步骤中的选项仅在先前的步骤中选择了某些选项时才可用。例如,如果用户在第 2 步选择创建作为服务器的应用程序,则第 6 步中的动态骨架接口(Dynamic Skeleton Interface)选项将启用,而动态调用接口(Dynamic Invocation Interface)选项将禁用。如果用户在第 2 步选择创建作为客户端的应用程序,则第 6 步中的动态调用接口选项将启用,而动态骨架接口选项将禁用。

每个步骤中所有可用的各种选项都在相应对话框的 `OnInitDialog` 函数中初始化。如果用户不突然改变主意,返回到前面的步骤选择不同的选项,这样就可以了。如果用户在第 2 步选择了服务器选项,并且已到达第 6 步,那么如上所述,动态骨架接口选项将启用。但是,如果他决定返回到第 2 步并选择客户端选项,那么在到达第 6 步时,动态骨架接口选项仍将启用。这是因为 `OnInitDialog` 函数仅被调用一次,即在创建对话框时。代表每个步骤的对话框在各个步骤之间的移动时不会被创建,因为所有对话框都已经在 `CDialogChooser` 类的构造函数中创建了。在构造函数中,设置了一个指针数组,其中每个数组元素都指向一个特定的对话框。

CDialogChooser::CDialogChooser()
{
  m_pDlgs[0] = NULL;

  m_pDlgs[1] = new CCustom1Dlg;

  m_pDlgs[2] = new CCustom2Dlg;

  m_pDlgs[3] = new CCustom3Dlg;

  m_pDlgs[4] = new CCustom4Dlg;

  m_pDlgs[5] = new CCustom5Dlg;

  m_pDlgs[6] = new CCustom6Dlg;

  m_nCurrDlg = 0;
}

要使 `OnInitDialog` 函数再次被调用,从而启用正确的选项,需要在步骤激活时创建相应的对话框。这可以通过 `Next` 函数中的以下代码来实现

// Use the internal array to determine the next step.
CAppWizStepDlg* CDialogChooser::Next(CAppWizStepDlg* pDlg)
{
  ASSERT(0 <= m_nCurrDlg && m_nCurrDlg < LAST_DLG);
  ASSERT(pDlg == m_pDlgs[m_nCurrDlg]);

  //Delete the current dialog and create the next one
  m_nCurrDlg++;
  int pos = m_nCurrDlg;
  switch (m_nCurrDlg)
  {
     case 1 : m_pDlgs[m_nCurrDlg] = new CCustom1Dlg;
      break;
    case 2 : delete m_pDlgs[--pos]; //prevent memory leak
      m_pDlgs[pos] = NULL;
      m_pDlgs[m_nCurrDlg] = new CCustom2Dlg;
      break;
   
      .... //The same for cases 3 to 6
  }
  return m_pDlgs[m_nCurrDlg];
}

`Back` 函数也一样

// Use the internal array to determine the previous step.
CAppWizStepDlg* CDialogChooser::Back(CAppWizStepDlg* pDlg)
{
  ASSERT(1 <= m_nCurrDlg && m_nCurrDlg <= LAST_DLG);
  ASSERT(pDlg == m_pDlgs[m_nCurrDlg]);
  m_nCurrDlg--;
  int pos = m_nCurrDlg;
  switch (m_nCurrDlg)
  {
    case 1 : delete m_pDlgs[++pos]; //prevent memory leak
      m_pDlgs[pos] = NULL;
      m_pDlgs[m_nCurrDlg] = new CCustom1Dlg;
      break;
   
      .... //The same for cases 2 to 5
         
    case 6 : m_pDlgs[m_nCurrDlg] = new CCustom6Dlg;
      break;
  }
  return m_pDlgs[m_nCurrDlg];
}

循环宏

在 `CCustom3Dlg` 中,可以输入一个或多个接口的名称。这些名称存储在字典中,宏为 `NAME_x`。接口总数存储在另一个宏 `INTERFACES` 中,可以在 `$$BEGINLOOP` 中使用。如果名称 `Quoter` 和 `QuoterFactory` 分别存储在字典中,宏为 `NAME_0` 和 `NAME_1`,并且数字 `2` 存储在 `INTERFACES` 中,那么下面的

$$BEGINLOOP(INTERFACES)
  interface $$NAME$$
  {
    
  };

$$ENDLOOP

将变为

  interface Quoter
  {
  
  };
  
  interface QuoterFactory
  {
  
  };

待办事项

要添加的附加功能

  • 支持动态 CORBA
  • 支持 CORBAServices
  • IDL 编译器选项

如果可能的话

  • 向创建的工作区添加一个新项目,以便在最终显示工作区时包含两个项目。
    这是当用户选择“服务器和客户端”选项时。
  • 向新添加的项目添加文件夹及其相关文件。

参考文献和更多信息

历史

  • 2003 年 11 月 3 日 - 首次公开发布。
  • 2002 年 10 月 12 日 - 开始开发和编写应用程序向导。
© . All rights reserved.