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






4.92/5 (9投票s)
2003年11月4日
5分钟阅读

43867

1204
关于如何使用 CORBA 应用向导的教程
引言
这是使用 CORBA AppWizard 教程的第二部分。教程的第一部分介绍了应用程序向导的步骤。本部分将通过实现股票报价应用程序来完成教程。
完成应用程序
现在应用程序的框架已经生成,并且工作区已由 IDE 显示,我们可以添加代码并完成股票报价应用程序。在视图中显示的所有文件中,只有 StdAfx.cpp、StdAfx.h 和 QuoterServer.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.cpp 和 QuoterI.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.h 和 QuoterI.cpp 文件所做的任何更改都将被 TAO_IDL 编译器生成的骨架代码覆盖。而是突出显示 StdAfx.cpp 文件并进行编译。然后分别单独编译 QuoterI.cpp 和 QuoterServer.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 日 - 首次公开发布。