私は、DLLの境界を越えて文字列にデータを埋め込む方法を探していました。異なるコンパイラを使用しているため、すべてのdllインタフェースは単純なchar *です。std :: string内部バッファに直接書き込む
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]が、それはあなたがその文字列を思うだろうことを考えると、これを行うには正しい方法です::データ()== &文字列[0]?それは矛盾しているようです。
それとも、余分な割り当てを飲み込むと、質問を避けた方が良いです:
vector<char> vectorToFillIn(100);
FunctionInDLL(&vectorToFillIn[0], vectorToFillIn.size());
string dllGaveUs(&vectorToFillIn[0]);
、あなたはバッファとしてのstd ::ベクトルを使用して起動した場合ベクトルの各要素が1つずつ初期化される、異なる種類のパフォーマンス問題に遭遇します。 32Kのバッファを確保しておくと、このバッファを初期化するのにかなりのCPU時間を費やすことになります。連続したメモリのチャンクが必要な場合は、単に配列new char []をstd :: unique_ptrや他のRAIIパターンと組み合わせて使用する方がはるかに優れています。あなたが絶対に各要素を初期化する必要がある場合を除きます。 –
http://stackoverflow.com/questions/11149665/c-vector-that-doesnt-initialize-its-membersのvectorトリックを使用してください。 –
"標準では' std :: string'のデータが 'char *'として格納されていることを保証していません。 "それは保証されています。 'std :: string'は' char'を使います。 http://en.cppreference.com/w/cpp/string/basic_string – cambunctious