I was looking for a way to stuff some data into a string across a DLL boundary. Because we use different compilers, all our dll interfaces are simple char*.
Is there a correct way to pass a pointer into the dll function such that it is able to fill the string buffer directly?
string stringToFillIn(100, '\0'); FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() ); // definitely WRONG! FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() ); // WRONG? FunctionInDLL( &stringToFillIn, stringToFillIn.size() ); // WRONG? stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );
The one that looks most promising is &stringToFillIn but is that a correct way to do this, given that you’d think that string::data() == &string? It seems inconsistent.
Or is it better to swallow an extra allocation and avoid the question:
vector<char> vectorToFillIn(100); FunctionInDLL( &vectorToFillIn, vectorToFillIn.size() ); string dllGaveUs( &vectorToFillIn );
I’m not sure the standard guarantees that the data in a
std::string is stored as a
char*. The most portable way I can think of is to use a
std::vector, which is guaranteed to store its data in a continuous chunk of memory:
std::vector<char> buffer(100); FunctionInDLL(&buffer, buffer.size()); std::string stringToFillIn(&buffer);
This will of course require the data to be copied twice, which is a bit inefficient.
Answered By – CAdaker
Answer Checked By – Jay B. (BugsFixing Admin)