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

CORBA 应用程序向导 - 使用教程。第二部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (9投票s)

2003年11月4日

5分钟阅读

viewsIcon

43867

downloadIcon

1204

关于如何使用 CORBA 应用向导的教程

引言

这是使用 CORBA AppWizard 教程的第二部分。教程的第一部分介绍了应用程序向导的步骤。本部分将通过实现股票报价应用程序来完成教程。

完成应用程序

现在应用程序的框架已经生成,并且工作区已由 IDE 显示,我们可以添加代码并完成股票报价应用程序。在视图中显示的所有文件中,只有 StdAfx.cppStdAfx.hQuoterServer.cpp 包含代码。所有其他文件基本上都是空的,除了显示以下消息:

//DO NOT ENTER ANYTHING HERE !!!!

//THIS WILL BE REPLACED BY CODE ONCE THE *.IDL FILE HAS BEEN COMPILED

那么,让我们开始吧。

IDL 文件

现在打开 Quoter.idl 文件。它应该包含以下内容:

#ifndef Quoter_module
#define Quoter_module

module Quoter
{
    interface Stock
    {
        
    };

    interface StockFactory
    {
        
    };

};

#endif    //Quoter_module

首先,我们需要定义接口。我们将从 Stock 接口开始,其中一个用于查询股票价格的函数是我们首先要处理的。(粗体代码是需要添加的内容)。

interface Stock
{
  double price();
};

每只股票还与其名称和符号相关联,我们可以称之为股票的属性。因此,让我们添加这些属性,并且为了让用户只能查询而不能设置它们,我们将使它们成为只读的。

interface Stock
{
  double price();
    
    readonly attribute string symbol;
    readonly attribute string full_name;
};

要获取与特定符号对应的股票对象,我们需要使用 StockFactory 接口并添加一个函数,该函数接受一个符号作为参数并返回与该符号关联的股票。但是,如果将无效符号作为参数传递给此函数,则会发生错误。引发的错误将以异常的形式出现。

module Quoter
{
  exception Invalid_Stock_Symbol {};
    
  interface Stock
  ....
  interface StockFactory
  {
    Stock get_stock(in string stock_symbol) raises (Invalid_Stock_Symbol);
  };

现在可以编译 Quoter.idl。编译由 TAO_IDL 编译器完成。如果一切顺利,打开时,空文件现在将包含各种形式的代码。生成的一些文件中的代码是骨架形式,您需要为其添加“肉”。

服务器应用程序

打开 QuoterI.cppQuoterI.h 文件。这就是 Quoter.idl 中找到的接口将被实现的地方。无需打开任何其他文件,例如 QuoterS.cpp 包含 CORBA 相关的骨架代码,QuoterC.cpp 包含 CORBA 相关的存根代码,可能会让你头疼。首先,让我们看一下 QuoterI.h 文件。Stock 接口由 Quoter_Stock_i 类实现,而 StockFactory 接口由 Quoter_StockFactory_i 类实现。我们将首先查看 Quoter_Stock_i 类,然后查看 Quoter_StockFactory_i 类(同样,粗体代码是您需要输入的)。

class  Quoter_Stock_i : public virtual POA_Quoter::Stock
{
public:
  //Constructor 
  Quoter_Stock_i (const char* symbol, const char* full_name, 
    CORBA::Double price);
  ...

private:
  std::string symbol_;
    std::string full_name_;
    CORBA::Double price_;
}

StockFactory 将只有两只股票:RHAT 和 MSFT。

//Class Quoter_StockFactory_i
class  Quoter_StockFactory_i : public virtual POA_Quoter::StockFactory
{
public:
   ...

private:
   Quoter_Stock_i rhat_;
     Quoter_Stock_i msft_;

};

现在让我们看一下 QuoterI.cpp 文件,上面显示的函数将在其中实现。

让我们专注于 Quoter_Stock_i 类。首先是构造函数。

Quoter_Stock_i::Quoter_Stock_i (const char *symbol, const char *full_name, 
    CORBA::Double price)
  : symbol_ (symbol), full_name_ (full_name), price_ (price)
{
}

首先,我们将实现 Quoter_Stock_i 类中声明的函数。

  • symbol() 函数。此函数返回与股票关联的符号。
char* Quoter_Stock_i::symbol() throw (CORBA::SystemException)
{
  return CORBA::string_dup(this->symbol_.c_str());
}
  • full_name() 函数。此函数返回与股票关联的名称。
char* Quoter_Stock_i::full_name() throw (CORBA::SystemException)
{
  return CORBA::string_dup(this->full_name_.c_str());
}
  • price() 函数。此函数返回股票的当前价格。
CORBA::Double Quoter_Stock_i::price() throw (CORBA::SystemException)
{
  return this->price_;
}

现在轮到 Quoter_StockFactory_i 类了。只有一个函数需要实现,即 get_stock()

Quoter::Stock_ptr Quoter_StockFactory_i::get_stock(
        const char * stock_symbol) throw 
    (CORBA::SystemException, Quoter::Invalid_Stock_Symbol)
{
  if (strcmp (symbol, "RHAT") == 0)
  {
    return this->rhat_._this();
  }
    else if (strcmp (symbol, "MSFT") == 0)
    {
    return this->msft_._this ();
  }
  throw Quoter::Invalid_Stock_Symbol ();

}

Quoter_StockFactory_i 构造函数也需要一些更改。

Quoter_StockFactory_i::Quoter_StockFactory_i()
  : rhat_("RHAT", "RedHat, Inc.", 210), msft_("MSFT", "Microsoft, Inc.", 91) 
{
}

最后,我们转向 QuoterServer.cpp 文件(QuoterServer 是我给项目起的名字,所以无论您给项目起了什么名字,都请查找一个带有该名称和 .cpp 扩展名的文件),并查看 main() 函数。

  //create object here
  Quoter_StockFactory_i stock_factory_i;

  // Activate it to obtain the object reference
  Quoter::StockFactory_var stock_factory = stock_factory_i._this();

    CORBA::String_var ior = orb->object_to_string(stock_factory.in());
    cout << ior.in() << endl;

现在是时候构建服务器应用程序了。但首先有一个警告,不要点击“构建”工具栏按钮!问题是 Quoter.idl 文件将被重新编译,您对 QuoterI.hQuoterI.cpp 文件所做的任何更改都将被 TAO_IDL 编译器生成的骨架代码覆盖。而是突出显示 StdAfx.cpp 文件并进行编译。然后分别单独编译 QuoterI.cppQuoterServer.cpp 文件。现在您可以点击“构建”工具栏按钮。

客户端应用程序

idl 文件与 服务器应用程序 的相同。因此,只需将 Quoter.idl 文件从服务器应用程序的目录复制到客户端应用程序的目录。打开 Quoter.idl 文件并进行编译。同样,将使用 TAO_IDL 编译器。最初 QuoterC.cpp 文件将是空的,但在编译后将包含 CORBA 存根代码。对于股票报价应用程序的客户端,我们只需要查看 main() 函数(记住粗体代码是您需要输入的)。

  //You code goes here!
  Quoter::StockFactory_var factory = 
    Quoter::StockFactory::_narrow(obj.in());
  for (int i = 2; i != argc; i++)
  {
    try
    {
      Quoter::Stock_var stock = factory->get_stock(argv[i]);
      CORBA::String_var name = stock->full_name();
      CORBA::Double price = stock->price();

      cout << "The price of stock in \"" << name.in() << "\" is $" 
        << price << endl;
    }
    catch(Quoter::Invalid_Stock_Symbol&)
    {
      cerr << "Invalid stock symbol <" << argv[i] << ">" << endl;
    }
  }
    orb->destroy();
现在让我们构建客户端应用程序,但与服务器应用程序相比,您可以立即点击“构建”工具栏按钮。

运行应用程序

现在您已经编译并构建了服务器和客户端应用程序,是时候运行股票报价应用程序并看看一切是否正常了。打开两个 DOS 提示符窗口。在第一个窗口中输入:

server > ior_file

并保持窗口打开。下图显示了我电脑上输入的内容。


在第二个窗口中输入:

client file://ior_file MSFT RHAT HALO

然后按 回车键。下图显示了我电脑上的命令和结果。请注意,我们在 StockFactory 中没有实现 HALO 作为股票,因此出现了错误消息。

注释

如果您有任何评论或发现任何错误,请告诉我。

历史

  • 2003 年 11 月 3 日 - 首次公开发布。
© . All rights reserved.