我应该使用哪种解决方案将std :: string的某些内容深层复制到C ++中的dll边界的char *上?
memcpy(szValue, value.c_str(), value.size())
或
strncpy_s(szValue, strlen(szValue), value.c_str(), value.length())
dll中从外部调用的方法:
unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
// ...
}
我也尝试过:
std::string value = m_xmlParser.GetNodeValue(propName);
std::vector<char> propValue(value.begin(), value.end());
propValue.push_back('\0');
szValue = &propValue[0];
但这只是一个浅拷贝(离开dll后char *数组为空)
memcpy和strncpy_s不是C ++函数,但可以在这里使用它吗?
THX
答案 0 :(得分:1)
如果我说得对,你就是试图用这种方式实现GetProp:
unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
std::string value = m_xmlParser.GetNodeValue(propName);
std::vector<char> propValue(value.begin(), value.end()); //propValue is on stack, mistake 1
propValue.push_back('\0');
szValue = &propValue[0];
}
在这一行szValue = &propValue[0];
上,你使szValue指向函数返回时将被删除的内存 - 错误2,最大的错误(3)是你正在修改本地变量 - 指向char的szValue指针是本地的......
unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
std::string value = m_xmlParser.GetNodeValue(propName);
memcpy(szValue, value.c_str(), value.length()+1);
return ... whatever you want to ...
}
如何调用GetProp:
char buffer[MAX_SIZE_AS_PER_INTERFACE_API];
GetProp(propName, buffer);
答案 1 :(得分:0)
unsigned int Interface::GetProp(const char* const szName, char* szValue)
上述函数只能通过szValue
参数调用,该参数指向某个Interface API指定的最大大小的字符缓冲区。仅仅通过查看函数就无法知道这个大小是什么......你应该检查文档,希望有一个常量定义。调用它的正确方法似乎是:
char buffer[MAX_SIZE_AS_PER_INTERFACE_API];
unsigned n = m_xmlParser.GetProp(propName, buffer);
也可能有一个单独的函数来找出属性值的长度,这样你就可以事先创建一个已知足够大的缓冲区....
在上面的代码中,propName
可以是字符串文字,propName.c_str()
可以是std::string
。
您还应该检查API以查看返回的unsigned
值的含义。