Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо