tsdima писал(а):
Нет, надо сначала SetLength делать, а уж потом туда считыватьЧему SetLength делать str или s
Я в первом примере не показал, что перед созданием Thread я уже сделал первый SetLength(str,MAXWORD);
И все таки я не понял, вот так надо, что ли
procedure THIMailSlot_Server._work_doCreate;
begin
if not Assigned(th) then begin
lol:= ReadString(_Data,_data_Name,_prop_Name);
ms := CreateMailslot(PChar('\\.\mailslot\'+lol),0,MAILSLOT_WAIT_FOREVER,nil);
if ms = INVALID_HANDLE_VALUE then
_hi_OnEvent(_event_onStatus,0)
else begin
_hi_OnEvent(_event_onStatus,1);
SetLength(str, MAXWORD);
SetMailslotInfo(ms,10);
{$ifdef F_P}
th := NewThreadforFPC;
{$else}
th := NewThread;
{$endif}
th.OnExecute := _OnExec;
th.Resume;
end;
end;
end;
function THIMailSlot_Server._OnExec;
var nBytesRead:cardinal;
begin
while not Sender.Terminated do begin
if ReadFile(ms, str[1], MAXWORD, nBytesRead, nil) then begin
SetLength(str,nBytesRead);
SetLength(s,nBytesRead);
s := str;
SetLength(str,MAXWORD);
Sender.Synchronize(SyncExec);
end;
end;
Result := 0;
end;