Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
ВнизConvertStrToNetUnicode в функции ошибка Найти похожие ветки
← →
Dust © (2005-08-25 14:17) [0]тестирование показало, что именно в этом участке кода ошибка
(сама ошибка вылазить значительно позже, спустя 200 а то и 500 строк)
вот текст самой функции
Procedure ConvertStrToNetUnicode (const str : Pchar;var len : byte);
var pwch : PWORD;
tmpstr : String;
ln : Integer;
begin //конвертирует строку для отправки в Unicode кодировке Src-String должна содержать len*2 байт
len:=len shl 1;
pwch := Pointer(str);
StringToWideChar(str, PWideChar(pwch), len);
for ln := len-1 downto 0 do
begin
pwch^:= htons(pwch^);
inc (pwch);
end;
end;
//****************************
она вызывается вот в этом участке :.........
ab[9]:=length(tmpstr); //sm_length
if fUnicode then
begin
ab[7]:=$08; //data_coding
SetLength (tmpstr, ab[9]*2+2);
ConvertStrToNetUnicode (Pchar(tmpstr), ab[9]); //SETS sm_length
end;
.........
tmpstr - локально описанная строка типа String
← →
Dust © (2005-08-25 14:25) [1]всё, кажется нашёл, точнее кажется понял
Procedure ConvertStrToNetUnicode (const str : Pchar;var len : byte);
var pwch : PWORD;
tmpstr : String;
ln : Integer;
begin //конвертирует строку для отправки в Unicode кодировке Src-String должна содержать len*2 байт
len:=len shl 1;
pwch := AllocMem (ln); //Pointer(str);
StringToWideChar(str, PWideChar(pwch), len);
for ln := len-1 downto 0 do
begin
pwch^:= htons(pwch^);
inc (pwch);
end;
Move (pwch^, Pointer(str)^, len);
FreeMemory(pwch);
end;
← →
Dust © (2005-08-25 15:00) [2]прошу прощенья... опять ошибка
← →
han_malign © (2005-08-25 15:26) [3]
Procedure ConvertStrToNetUnicode (const str : Pchar;var len : byte);
var pwch : PWORD;
tmpstr : String;
ln : Integer;
begin //конвертирует строку для отправки в Unicode кодировке Src-String должна содержать len*2 байт
len:=len shl 1;
pwch := Pointer(str);
StringToWideChar(str, PWideChar(pwch), len);
for ln := len-1 downto 0 do
begin
pwch^:= htons(pwch^);
inc (pwch);
end;
end;
- inc (pwch) <==> PChar(pwch) = PChar(pwch)+2; а при этом len = len shl 2;
вторая версия:
pwch := AllocMem (ln); - ln не инициализировано...
да и лишнее это - память выделяется при создании временной AnsiString при передаче str в StringToWideChar...
← →
han_malign © (2005-08-25 15:29) [4]блин, тэг не закрыл... и с цифрами напутал - короче, внимательней к глобально(в области видимости) изменяемым длинам относись.
← →
Dust © (2005-08-25 18:32) [5]inc (pwch) <==> PChar(pwch)
это единственная ошибка которая оставаласьProcedure ConvertStrToNetUnicode (const str : Pchar;var len : byte);
var pwch : PWORD;
tmpstr : String;
ln : Integer;
p2 : Pointer;
begin //êîíâåðòèðóåò ñòðîêó äëÿ îòïðàâêè â Unicode êîäèðîâêå Src-String äîëæíà ñîäåðæàòü len*2 áàéò
len:=len shl 1;
pwch := AllocMem (ln); //Pointer(str);
StringToWideChar(str, PWideChar(pwch), len);
p2:= Pointer(pwch);
for ln := len-1 downto 0 do
begin
pwch^:= htons(pwch^);
inc (pwch);
end;
Move (p2^, str^, len);
FreeMemory(pwch);
end;
← →
Dust © (2005-08-25 18:32) [6]былин..
долбаная винда с её юникодом...
← →
Джо © (2005-08-25 18:35) [7]
> [6] Dust © (25.08.05 18:32)
> долбаная винда с её юникодом...
А виновата, как всегда, "Винда".
← →
Dust © (2005-08-25 19:05) [8]pwch :=p2;
FreeMemory(pwch);
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c