gpt4 book ai didi

delphi - PChar StrPLCopy 上的无效指针操作

转载 作者:行者123 更新时间:2023-12-03 15:53:07 25 4
gpt4 key购买 nike

我使用 WinSock 2 编写了一些 TCP 服务器,并且我有一个捕获 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);

请帮助我解决这个问题并理解为什么会发生。 TIA!

最佳答案

在使用 StrPLCopy 之前,您必须为 params 变量分配内存。 (用户名密码tempytempn也是如此)

检查此示例

Var
Dest : PChar;
Source : PChar;
begin
Source:='This is a buffer to copy';
//alloc a buffer of 1024 bytes
GetMem(Dest,1024);
try
//copy
StrPLCopy(Dest, Source, Length(Source));
//do something
Writeln(Dest);
finally
//free the memory
FreeMem(Dest);
end;
end;

关于delphi - PChar StrPLCopy 上的无效指针操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com