![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ConvertStrToNetUnicode в функции ошибка [D5, D7, Win2k, WinXP]
Dust © (2005-08-25 14:17:00)тестирование показало, что именно в этом участке кода ошибка
(сама ошибка вылазить значительно позже, спустя 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 19:05:00) [1]pwch :=p2;
FreeMemory(pwch);
Джо (2005-08-25 18:35:00) [2]
> [6] Dust © (25.08.05 18:32)
> долбаная винда с её юникодом...
А виновата, как всегда, "Винда".
Dust (2005-08-25 18:32:00) [3]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:00) [4]былин..
долбаная винда с её юникодом...
han_malign (2005-08-25 15:29:00) [5]блин, тэг не закрыл... и с цифрами напутал - короче, внимательней к глобально(в области видимости) изменяемым длинам относись.
han_malign (2005-08-25 15:26:00) [6]
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...
Dust (2005-08-25 15:00:00) [7]прошу прощенья... опять ошибка
Dust (2005-08-25 14:25:00) [8]всё, кажется нашёл, точнее кажется понял
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;