C ++ Builder — Различия с AnsiString и AnsiString, переданные из UnicodeString в C ++ Builder

Я использую C ++ Builder XE3, и у меня возникла странная проблема с AnsiString.

Просто посмотрите на приведенный ниже код

//Code 1: first time
AnsiString temp1 = "test" ;
funcA(temp1,temp1);

//Code 2: second time
String uTemp2 = "test";
AnsiString temp2 = uTemp2;
funcA(temp2,temp2);

На мой взгляд, в первый раз он работает хорошо, однако во второй раз выдает исключение «Плохой формат». И даже я однажды позвонил funcA с Code 2, проблема осталась.

Поскольку это не имеет значения, когда я ShowMessage в temp1 или temp2. Я совершенно не могу понять, почему два раза звонок дал мне разные результаты.

funcA из третьей библиотеки с немного сложным кодом. Поэтому, прежде чем проследить код этой библиотеки, я думаю, что я должен знать, в чем разница с Code1 и Code2.

Благодарю.

0

Решение

Так далеко как funcA() обеспокоен тем, что нет абсолютно никакой разницы char* или UnicodeString был назначен на AnsiString, Представление в памяти AnsiString данные одинаковы в обоих случаях. Так что должна быть проблема внутри funcA() сама, которая вызывает ошибку, независимо от того, как вы готовите AnsiString, Но не зная что funcA() на самом деле, и какой вклад он ожидает, нет способа диагностировать эту проблему. вам придется проследить логику внутри funcA(),

Ты говоришь funcA() исходит из сторонней библиотеки. Что это за библиотека? Это статически связанная LIB или внешняя DLL / BPL? Это имеет большое значение. Если это внешняя DLL / BPL, то вы не можете безопасно передавать данные не POD, такие как AnsiStringза границей DLL, если только DLL / BPL не были скомпилированы с помощью EXACT SAME компилятора, RTL и диспетчера памяти в качестве вашего EXE-файла (в случае BPL это также означает включение пакетов времени выполнения в проектах BPL и EXE). Если это не так, то вероятно, что DLL / BPL использует другой RTL / MM, который интерпретирует в памяти AnsiString данные иначе, чем ваш EXE. Данные в памяти AnsiString было изменено в CB2009, чтобы включить новые поля (а именно кодовую страницу и размер элемента), поэтому, если DLL / BPL был скомпилирован в более ранней версии компилятора, плохие вещи могут произойти, когда он пытается использовать AnsiString от вашего нового компилятора (и наоборот).

2

Другие решения

Первое, что мне пришло в голову, это то, что нет конструктора AnsiString из String, поэтому нет способа присвоить тип String для AnsiString. Вы не упоминаете ошибку компилятора, поэтому кажется, что компилятор делает для вас что-то неправильное.

Эта заметка Как конвертировать строку в AnsiString предоставляет способ сделать это безопасно.

В основном вам нужно ссылаться на буфер символов String переменных в присваивании, чтобы компилятор делал правильные вещи.

Это более старая ссылка на AnsiString (1997) это предоставляет информацию о некоторых конструкторах и возможных преобразованиях.

0

По вопросам рекламы [email protected]