在前一篇文章中,大家可能都注意到了一个细节,Ice的初始化函数initialize的输入参数正好是主函数的输入参数,也就是命令行参数(注:辅助类Ice::Application也调用了initialize函数)。
Ice的初始化函数得到命令行参数后,抽取出Ice专有参数,并把分析后的配置存入到Ice的属性表中。
假设命令行为:
MyProg.exe --myoption --Ice.Config=config\
-x a --Ice.Trace.Network=3 -y opt file
其中MyProg.exe是我们用Ice编写的程序,当Ice::initialize返回时,Ice的两个专用参数就会被抽去,argc由原来的9变成7,argv为:
MyProg.exe
--myoption
-x
a
-y
opt
file
抽去的两个参数则存放于属性表里。属性表的类型为Ice::Properties,它的常用方法有:
std::string getProperty(const std::string& prop);
std::string getPropertyWithDefault(const std::string& prop, const std::string&);
Ice::Int getPropertyAsInt(const std::string& prop);
Ice::Int getPropertyAsIntWithDefault(const std::string& prop, Ice::Int);
取得prop属性的值
Ice::StringSeq getPropertyAsList(const ::std::string& prop);
Ice::StringSeq getPropertyAsListWithDefault(const ::std::string& prop, const ::Ice::StringSeq&);
取得prop属性的值,并返回按逗号分割成的一组值。这里的Ice::StringSeq就是std::vector<std::string>(注:集合类型可通过配置改变,默认是vector)。
比如:有命令行参数: --MyProp.Test=abc,def,aaa,sde,s 则返回
abc
def
aaa
sde
s
Ice::PropertyDict getPropertiesForPrefix(const ::std::string& prefix);
返回所有含有prefix前缀的所有属性,PropertyDict是一个std::map<std::string, std::string>类型的数据表。
void setProperty(const ::std::string& prop, const ::std::string&);
设置prop属性的值
Ice::StringSeq getCommandLineOptions();
把属性表中的所有数据转化成字符串列表
Ice::StringSeq parseCommandLineOptions(
const std::string& prefix, const Ice::StringSeq& args);
分析命令行参数,抽取出所有prefix前缀的参数,返回剩余的命令行参数。由于main函数输入的是argc和argv,我们可以使用Ice::StringSeq argsToStringSeq(int, char*[])和void stringSeqToArgs(const StringSeq&, int&, char*[])函数在StringSeq与argc/argv之间互相转换。
Ice::StringSeq parseIceCommandLineOptions(const Ice::StringSeq&);
分析Ice专有命令行参数
void load(const std::string& file);
载入file指定的配置文件,关于配置文件后文还会讲到
Ice::PropertiesPtr clone()
返回一个属性表的拷贝
下面是获得属性表的两个常用方式:
Ice::PropertiesPtr createProperties();
生成一个全新的属性表
Ice::PropertiesPtr Ice::Communicator::getProperties();
从连接器中取得当前使用的属性表
利用属性表改进我们的程序
比如,我们前面的客户端的例子:
class MyApp: public Ice::Application{
public:
virtual int run(int, char*[])
{
Ice::CommunicatorPtr ic = communicator();
Ice::ObjectPrx base =
ic->stringToProxy("SimplePrinter:default -p 10000");
PrinterPrx printer = PrinterPrx::checkedCast(base);
if(!printer) throw "Invalid Proxy!";
printer->printString("Hello World!");
return 0;
}
};
ic->stringToProxy("SimplePrinter:default -p 10000");这句把代理名、协议、端口以及主机名都固化在了程序中。有时,我们需要更大的灵活性,比如由命令行参数或配置文件指定它们,上面提到的Properties接口就可以帮我们:
class MyApp: public Ice::Application{
public:
virtual int run(int, char*[])
{
Ice::CommunicatorPtr ic = communicator();
Ice::PropertiesPtr prop = ic->getProperties();
string s = prop->getPropertyWithDefault(
"Ice.Printer","SimplePrinter:default -p 10000");
Ice::ObjectPrx base = ic->stringToProxy(s);
PrinterPrx printer = PrinterPrx::checkedCast(base);
if(!printer) throw "Invalid Proxy!";
printer->printString("Hello World!");
return 0;
}
};
这里,代理字符串从属性表(Ice::Properties,Ice::PropertiesPtr是Ice::Properties的智能指针)中得到,我们只要改变命令行参数就可以改变这个字符串,如:
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 10000"
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
...
可能你已经猜到,如果命令行里没有指定Ice.Printer,则使用默认的"SimplePrinter:default -p 10000"
另外,上面的:
Ice::PropertiesPtr prop = ic->getProperties();
string s = prop->getPropertyWithDefault(
"Ice.Printer","SimplePrinter:default -p 10000");
Ice::ObjectPrx base = ic->stringToProxy(s);
三条指令可以用一条指令代替:
Ice::ObjectPrx base = ic->propertyToProxy("Ice.Printer");
多写几行有时还是有用的,我们可以利用它来读取我们自定义的一些参数^_^(当然还有默认参数功能)
上面的命令行里我们取的是"Ice.Printer"属性,注意它的前缀是"Ice.",如果我们改成其它前缀,如"MyProp.",那么Ice初始化时就不认为这是Ice专用参数而不理睬它了。
我们想自定义一些属性用于“私用”的话,使用"Ice."前缀就显得不合理了,这时我们可以使用属性集的parseCommandLineOptions方法来解析指定前缀的参数:
class MyApp: public Ice::Application{
public:
virtual int run(int argc, char*argv[])
{
Ice::CommunicatorPtr ic = communicator();
Ice::PropertiesPtr prop = Ice::createProperties();
prop->parseCommandLineOptions("MyProp",
Ice::argsToStringSeq(argc,argv));
string s = prop->getPropertyWithDefault(
"MyProp.Printer","SimplePrinter:default -p 10000");
Ice::ObjectPrx base = ic->stringToProxy(s);
PrinterPrx printer = PrinterPrx::checkedCast(base);
if(!printer) throw "Invalid Proxy!";
printer->printString("Hello World!");
return 0;
}
};
现在,程序可以解析MyProp.Printer属性了。
配置文件
对于少量的属性,使用命令行参数确实没什么问题,一旦自定义属性增加,使用命令行参数就显得不太合适了。
Ice允许我们把所有的属性参数写到一个文本文件里,每个参数一行,比如有:
MyProg.exe \
--MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5" \
--MyProp.Test="abc,def,aaa,sde,s"
我们可以生成一个文本文件,内容:
MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
MyProp.Test="abc,def,aaa,sde,s"
然后,把上面的命令行参数改成:
MyProg.exe --Ice.Config=文件名
或者使用Ice::Properties::load方法载入文件,
或者使用Ice::Properties::parseIceCommandLineOptions方法解析文本内容。
分享到:
相关推荐
配置信息包括客户端和服务器端的配置,以及如何设置相应的属性来满足应用程序的需求。 总结来说,文档为开发者提供了一个全面的ICE学习指南,从ICE的基础知识到实际的编程应用,再到配置和性能优化,覆盖了ICE开发...
3. **Ice.props**:这是ICE的项目属性文件,包含编译ICE接口定义文件所需的配置信息,如编译器选项、目标平台等。在Visual Studio中,这个文件可以被用来自动配置ICE编译器的设置。 4. **ICEChat.sln**:这是一个...
- 在“配置属性”->“C/C++”->“常规”中,将ICE的头文件路径添加到“附加包含目录”中,即`C:\Program Files (x86)\ZeroC\Ice-3.5.1\include\Ice`。 - 在“配置属性”->“链接器”->“常规”中,将ICE的库文件...
第 14 章 Ice 属性与配置 307 14.1 本章综 307 14.2 属性 307 14.3 配置文件 309 14.4 在命令行上设置属性 309 14.5 Ice.Config 属性 310 14.6 命令行解析与初始化 311 14.7 Ice.ProgramName 属性 312 14.8 在程序中...
在配置好环境之后,可以使用ICE提供的工具将Slice文件转换为C#的接口文件。步骤如下: 1. **放置Slice文件**:确保Slice文件位于一个英文路径下,例如放置在D盘根目录。 2. **运行命令行**:打开命令提示符,切换到...
- **5.1 Ice属性和配置**:介绍了如何配置ICE服务的属性。 - **5.2 C++线程和同步**:探讨了如何在C++中处理并发和同步问题。 - **5.3 Ice流接口**:介绍了ICE提供的流接口。 - **5.4 异步程序设计(AMI和AMD)**:...
本说明书将详细介绍 **Trace32_ice** 的基本操作、配置方法及高级功能,帮助用户快速上手并充分利用此工具进行高效开发。 #### 二、系统架构 **Trace32-ICE** 的系统架构主要由以下几个关键组件构成: 1. **SCU32...
2. **设置项目属性**:在VC6.0中打开或创建一个新的项目,右键选择“属性”,在“C/C++”选项卡下,添加Boost和ICE的Include路径到“常规”下的“附加包含目录”。同样,在“链接器”选项卡的“常规”部分,添加...
// 设置request的属性... Response response = demoProxy.serve(request); // 处理response... } } ``` 这个"icedemo"示例展示了如何在Java中使用ICE框架进行对象传输。ICE提供了高效的序列化机制和强大的异常...
- **功能**: Multi-ICE是ARM JTAG的配置程序,用于使ARM JTAG与目标板建立通讯连接,并能够反馈目标板上ARM处理器的相关硬件信息。它是ARM开发过程中的重要工具之一,主要用于调试和验证ARM处理器上的代码。 - **...
然后,可以通过Delphi的组件面板将所需控件拖放到表单上,通过属性设置调整控件行为,通过事件处理函数编写具体业务逻辑。 总的来说,Delphi ICE控件集是Delphi开发者的重要辅助工具,它能够提供一套全面的网络应用...
本文将深入探讨ICE运行时、动态ICE、连接管理和Freeze Map等相关概念。 1. ICE运行时 ICE运行时是ICE的核心组件,为ICE应用提供了基础设施和服务。其中,通信器(Ice::Communicator)作为ICE运行时的主入口点,扮演...
本文档是一份简明易懂的ICE(Internet Communication Engine)入门教程,旨在帮助初学者快速掌握ICE的使用方法,包括如何设置开发环境、配置编译参数以及创建并运行基本的分布式应用程序。ICE是ZeroC公司开发的一种...
zeroc ICE(Internet Communications Engine)是一款强大的分布式中间件,它提供了高效的远程...了解并掌握如何使用这样的脚本对于进行ICE相关的Java开发是非常重要的,它可以提升开发效率并确保代码的一致性和正确性。
4. **使用Java的“系统属性”替代**:在某些情况下,可以避免使用JNI直接调用DLL,而是利用Java的系统属性或Java的注册表API(如`sun.misc.Registry`,但请注意这个类是非公开的,使用时有风险)来访问注册表。...
一旦引入成功,你可以在 Realm 模型类上应用 `IceCream` 属性装饰器,如下所示: ```swift import Realm import IceCream class User: Object { @objc dynamic var name = "" @objc dynamic var age = 0 @Ice...