Acces violation на функции StrPLCopy

dizpers
Дата: 21.05.2011 21:58:17
Всем привет. Пишу TCP-сервер, на котором конечно же приходится обрабатывать приходящие сообщения. Сообщение - PChar строка длинной не более 16 КБайт - первый 4 байта - команда, следующие 8 байт - размер строки параметров, и следующим идет строка параметров, длина (в символах) которой равна длине, описанной в предыдущем пункте. Но это не суть вопроса. Вобщем есть код процедуры, отлавливающей событие FD_READ:

+
procedure TfrmMain.WndProc_OnWSANetEvent(var Msg: TMessage);
Var
  iCurrThread, n : Integer;
  i : Integer;
  temp : PChar;
  len : Integer;
  params : PChar;
  username : PChar; password : PChar;
  ind : Integer;
  tempy : PChar;
  tempn : PChar;
begin
  case WSAGetSelectEvent(Msg.LParam) of
    FD_READ :
      while True do
      begin
        if (FreeRThreads.GetCount <> 0) then
          begin
            iCurrThread := FreeRThreads.Pop;
            if (ReadThreads[iCurrThread].Terminated) then
              begin
                ReadThreads[iCurrThread].SetFSocket(Msg.WParam);
                ReadThreads[iCurrThread].Execute;

                temp := ReadThreads[iCurrThread].GetFText;
                meLog.Lines.Add(temp);

                if (copy(temp,1,2)='AU') then
                  begin

                    StrPLCopy(params, PChar(copy(temp, 7, StrToInt( copy(temp, 3, 4) ) )), 16372);
                    ind := pos(' ', params);
                    StrPLCopy(username, PChar(copy(params, 1, ind-1)), 16372);
                    StrPLCopy(password, PChar(copy(params, ind + 1, StrLen(params))), 16372);

                    StrPLCopy(tempy, PChar('AU0001y'), 14);
                    StrPLCopy(tempn, PChar('AU0001n'), 14);

                    if (username=PChar('dizpers')) then
                      if (password=PChar('admin')) then
                        send(Msg.WParam, tempy^, 14, 0)
                      else
                        send(Msg.WParam, tempn^, 14, 0)
                    else
                      send(Msg.WParam, tempn^, 14, 0);

                    meLog.Lines.Add('USER = '+username);
                    meLog.Lines.Add('PASSWORD = '+password);
                  end;



                FreeRThreads.Push(iCurrThread);
                break;
              end;
          end;
      end;
    FD_CLOSE :
      begin
        n := CSocketsCount - 1;
        for i := 0 to n do
          if (ClientSockets[i] = Msg.WParam) then
            begin
              closesocket(ClientSockets[i]);
              FreeSockets.Push(i);
              break;
            end;
      end;
  end;
end;


При отладке сервера, при получении сообщения на строке
StrPLCopy(params, PChar(copy(temp, 7, StrToInt( copy(temp, 3, 4) ) )), 16372);
выдает "Acces violation ... write address ...". Подскажите плиз - что я делаю не так. Как исправить?

PS
И вообще покритикуйте код - что пишу плохо?
Dimitry Sibiryakov
Дата: 21.05.2011 21:59:39

Память для params выделять Пушкин должен, как обычно?..

Posted via ActualForum NNTP Server 1.4

dizpers
Дата: 21.05.2011 22:10:42
Ок, для params я знаю сколько памяти выделить. Об этом мне приходит инфа в сообщении. А как выделить память под username и password - про них я знаю, что их длина должна быть не более 16372 байт и все. Или как-нибудь без явного выделения памяти можно?
defecator
Дата: 21.05.2011 22:22:58
[quot dizpersкак выделить память под username и password - про них я знаю, что их длина должна быть не более 16372 байт[/quot]

Представляю, как усер набирает пароль длиной 16372 символа ))))))))))))))))))

ТС, выдели 256 байт, не жадничай - этого будет выше крыши, поверь )))
dizpers
Дата: 21.05.2011 22:29:25
Смысл в том, что есть и команда "отправить сообщени", параметром которой является отправляемая строка. Вот туда про запас и взял стока памяти. Ну так вот суть то в чем - мне известна длина строки параметров, допустим в ней есть через пробел еще два параметра - мне их надо загнать в пчар-переменные - как это сделать? Можно ли без выделения памяти?
dizpers
Дата: 21.05.2011 22:51:13
А если просто делать
params := PChar(copy(temp, 7, StrToInt( copy(temp, 3, 4) ) )), 16372);
и для других переменных по аналогии, то понадобиться ли дополнительно выделять память? очищать?
Dimitry Sibiryakov
Дата: 21.05.2011 22:56:00

dizpers
Можно ли без выделения памяти?

Нельзя. Возвращайся в школу, повторяй основы функционирования компьютера.

Posted via ActualForum NNTP Server 1.4

dizpers
Дата: 21.05.2011 23:04:57
ОписАлся. Выше уже обозначил "без явного выделения памяти".
Anatoly Podgoretsky
Дата: 22.05.2011 07:00:17

Статический массив

Posted via ActualForum NNTP Server 1.4