IDL 文件定义了一个序列,其元素是 ICPParams 类型。
module project{
struct IPCParams{
string ipcSetId;
any params;
};
typedef sequence<IPCParams> Params;
};
我的示例代码(它是在 VS08 中使用 ACE_TAO 开发的)如下:
project::Params params(4);
params.length(4);
for(int i=0; i<4;i++){
project::IPCParams ipcP;
std::stringstream sstm("");
sstm <<"ipcid-" << " "<<i;
std::string val = sstm.str();
ipcP.ipcSetId = val.c_str();
std::stringstream xxxx("");
xxxx <<" paramters " << i ;
val = xxxx.str();
std::cout<<" str: "<<val.c_str()<<" || "<<val <<"||" <<std::endl;
ipcP.params <<= CORBA::Any::from_string(val.c_str(),100);
params[i] = ipcP;
}
CORBA::Any any;
any<<=params;
project::Params* params_out;
any >>= params_out;
//CORBA::Boolean flag = ttt->release();
project::IPCParams* ipcPtr = params_out->get_buffer();
for(int i=0; i< params_out->length(); i++){
// change ipcPtr[i] = > params_out[i] would cause error C2440: 'initializing' : cannot convert from 'project::Params' to 'project::IPCParams'
project::IPCParams ipcp = ipcPtr[i];
const char* realVal;
ipcp.params >>= CORBA::Any::to_string(realVal,100);
std::cout<<" id: "<<ipcp.ipcSetId <<" anyValue: "<< realVal <<std::endl;
}
}
上面的代码尝试演示将一个 ICPParams 序列 project::params 插入到任何对象中,然后从该对象中提取所有值。ICPParams 的一个成员也是任何对象,我只是在其中插入一个字符串。
这里的两个问题是:
除了使用 dynamicAny 或 get_buffer 之外,还有其他方法可以提取序列信息吗?
任何类型的 ICPParams::params 值的执行结果错误。这是输出:
调用测试参数... str: 参数 0 || ||004CF928 str: 参数 1 || ||004CF928 str: 参数 2 || ||004CF928 str: 参数 3 || ||004CF928 参数名称:参数 id:ipc id 0 anyValue:-004CF7AC id:ipc id 1 anyValue:-004CF7AC id:ipc id 2 任意值:-004CF7AC id:ipc id 3 任意值:-004CF7AC
显然,str 符合
const char* str = xxxx.str().c_str(); // Q2: str is blank??
在插入部分的循环中指向一个空字符串(它应该是非空白的)。我无法解释为什么
xxxx.str().c_str() => 正确的字符串
str => 空白..
有人可以帮忙吗?提前致谢。
在使用 C++ 进行高级 CORBA 编程中使用序列的 * 规则中的两条:
1-避免对复杂类型的元素使用数据构造函数。2- 除非确实需要,否则不要使用数据构造函数或缓冲区操作函数。
从 Any 中提取值后,我尝试使用以下方法获取第 i 个元素:
project::IPCParams ipcp = params_out[i];
代替
project::IPCParams* ipcPtr = params_out->get_buffer()
project::IPCParams ipcp = ipcPtr[i];
但是编译失败,您可以在评论中看到错误消息。