在这个包装器方法中,我返回DN_OPstruct
,它有两个const char*
属性:TargetNode_Identifier
和Name
。对于p/invoke
,我必须留在const char*
- 类型,std::string
将不起作用:
DN_OPstruct getDnOperationIntern(const char* charGuid){
DN_OPstruct op;
UA_OPstruct _op;
_op = GetOPData(charGuid);
op.direction = _op.direction;
op.Name = _op.Name.toUtf8();
op.TargetNode_Identifier = _op.TargetNode_Identifier.toUtf8();
op.TargetNode_NamespaceIndex = _op.TargetNode_NamespaceIndex;
op.Type_of_OP = _op.Type_of_OP;
return op ;
}
在我阅读时,您必须strcpy
const char*
。没有这样的帮助,属性的指针将失去他们的引用,我得到假属性。 strcpy的示例:
strcpy(new char[output.size()], output.c_str());
如何在我的方法中实现这个?
答案 0 :(得分:1)
你不应该在你的方法中实现它 - 相反,你应该在一个单独的函数中实现它,并在你需要复制字符串的所有地方使用它:
char *copyCString(const string& s) {
char *res = new char[s.size()+1]; // Add 1 for null terminator
strcpy(res, s.c_str());
return res;
}
现在您可以根据需要使用此功能进行复制:
op.Name = copyCString(_op.Name);
op.TargetNode_Identifier = copyCString(_op.TargetNode_Identifier);
您也可以从const char*
开始:
char *copyString(const char* s) {
char *res = new char[strlen(s)+1]; // Add 1 for null terminator
strcpy(res, s);
return res;
}
现在你这样称呼它:
op.Name = copyString(_op.Name.toUtf8());
op.TargetNode_Identifier = copyString(_op.TargetNode_Identifier.toUtf8());
当然,您有责任在完成后删除副本:
delete[] op.Name;
delete[] op.TargetNode_Identifier;
为此定义一个函数也是一个好主意:
void freeCopiedString(char *s) {
delete[] s;
}