Я использую 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.
Благодарю.
Так далеко как 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
от вашего нового компилятора (и наоборот).
Первое, что мне пришло в голову, это то, что нет конструктора AnsiString из String, поэтому нет способа присвоить тип String для AnsiString. Вы не упоминаете ошибку компилятора, поэтому кажется, что компилятор делает для вас что-то неправильное.
Эта заметка Как конвертировать строку в AnsiString предоставляет способ сделать это безопасно.
В основном вам нужно ссылаться на буфер символов String переменных в присваивании, чтобы компилятор делал правильные вещи.
Это более старая ссылка на AnsiString (1997) это предоставляет информацию о некоторых конструкторах и возможных преобразованиях.