我正在寻找一种跨 DLL 边界将一些数据填充到字符串中的方法。因为我们使用不同的编译器,所以我们所有的dll接口都是简单的char*。
是否有正确的方法将指针传递到 dll 函数中,以便它能够直接填充字符串缓冲区?
string stringToFillIn(100, '\0');
FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() ); // definitely WRONG!
FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() ); // WRONG?
FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() ); // WRONG?
stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );
看起来最有希望的是 &stringToFillIn[0] ,但考虑到您认为 string::data() == &string[0] ,这是一种正确的方法吗?看起来不一致。
或者最好接受额外的分配并避免这个问题:
vector<char> vectorToFillIn(100);
FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() );
string dllGaveUs( &vectorToFillIn[0] );
我不确定该标准能否保证 a 中的数据std::string
被存储为char*
。我能想到的最便携的方法是使用std::vector
,保证将其数据存储在连续的内存块中:
std::vector<char> buffer(100);
FunctionInDLL(&buffer[0], buffer.size());
std::string stringToFillIn(&buffer[0]);
这当然需要将数据复制两次,效率有点低。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)