我正在寻找一种方法将一些数据填充到跨 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] );
原文由 markh44 发布,翻译遵循 CC BY-SA 4.0 许可协议
我不确定标准是否保证
std::string
中的数据存储为char*
。我能想到的最便携的方法是使用std::vector
,它保证将其数据存储在连续的内存块中:这当然需要将数据复制两次,这有点低效。