@@ -8,6 +8,7 @@ interface
8
8
9
9
const
10
10
MAX_EVENT_COUNT = 1000 ;
11
+ BLOCK_SIZE = 255 ;
11
12
dolog = false;
12
13
13
14
type
@@ -135,7 +136,11 @@ TPipeThread = class(TThread)
135
136
136
137
end ;
137
138
138
- TBuf = array of byte;
139
+
140
+
141
+ TBuf = array [0 ..BLOCK_SIZE-1 ] of byte;
142
+
143
+
139
144
140
145
var
141
146
frmMain: TfrmMain;
@@ -217,24 +222,34 @@ function TPipeThread.ReadString():WideString;
217
222
var buf:TBuf;
218
223
var len:integer;
219
224
var us:UTF8String;
225
+ var pos:integer;
226
+ blklen:integer;
220
227
begin
221
228
len := ReadUI32();
222
229
if len = 0 then
223
230
begin
224
231
Result:=' ' ;
225
232
exit;
226
233
end ;
227
- SetLength(buf,len);
228
- ReadPipe(pipe,buf,len);
234
+ pos := 0 ;
229
235
SetLength(us,len);
230
- CopyMemory(@us[1 ], @buf[0 ], len);
236
+
237
+ while pos < len do
238
+ begin
239
+ if pos + BLOCK_SIZE <= len then
240
+ blklen := BLOCK_SIZE
241
+ else
242
+ blklen := len - pos;
243
+ ReadPipe(pipe,buf,blklen);
244
+ CopyMemory(@us[1 +pos], @buf[0 ], blklen);
245
+ pos := pos + blklen;
246
+ end ;
231
247
Result:=UTF8Decode(us);
232
248
end ;
233
249
234
250
function TPipeThread.ReadUI8 ():byte;
235
251
var buf:TBuf;
236
252
begin
237
- SetLength(buf,1 );
238
253
ReadPipe(self.pipe,buf,1 );
239
254
Result:=buf[0 ];
240
255
end ;
@@ -268,7 +283,6 @@ function TPipeThread.ReadValue(var ref:Boolean;var baseguid:TGUID;var guid:TGUID
268
283
function TPipeThread.ReadUI16 ():word;
269
284
var buf:TBuf;
270
285
begin
271
- SetLength(buf,2 );
272
286
ReadPipe(self.pipe,buf,2 );
273
287
Result:=(buf[0 ] shl 8 ) + buf[1 ];
274
288
end ;
@@ -281,7 +295,6 @@ function TPipeThread.ReadSI16(): SmallInt;
281
295
function TPipeThread.ReadUI32 ():cardinal;
282
296
var buf:TBuf;
283
297
begin
284
- SetLength(buf,4 );
285
298
ReadPipe(pipe,buf,4 );
286
299
Result:=(buf[0 ] shl 24 )+(buf[1 ] shl 16 )+(buf[2 ] shl 8 ) + buf[3 ];
287
300
end ;
@@ -301,15 +314,13 @@ function TPipeThread.ReadSI64():Int64;
301
314
procedure TPipeThread.WriteUI8 (val:byte);
302
315
var buf:TBuf;
303
316
begin
304
- SetLength(buf,1 );
305
317
buf[0 ] := val;
306
318
WritePipe(self.pipe,buf,1 );
307
319
end ;
308
320
309
321
procedure TPipeThread.WriteUI16 (val:word);
310
322
var buf:TBuf;
311
323
begin
312
- SetLength(buf,2 );
313
324
buf[0 ] := (val shr 8 ) mod 256 ;
314
325
buf[1 ] := val mod 256 ;
315
326
WritePipe(self.pipe,buf,2 );
@@ -318,7 +329,6 @@ procedure TPipeThread.WriteUI16(val:word);
318
329
procedure TPipeThread.WriteUI32 (val:cardinal);
319
330
var buf:TBuf;
320
331
begin
321
- SetLength(buf,4 );
322
332
buf[0 ] := (val shr 24 ) mod 256 ;
323
333
buf[1 ] := (val shr 16 ) mod 256 ;
324
334
buf[2 ] := (val shr 8 ) mod 256 ;
@@ -331,14 +341,23 @@ procedure TPipeThread.WriteString(val: widestring);
331
341
var a:TBuf;
332
342
len:integer;
333
343
s: UTF8String;
334
- i:integer;
344
+ blklen : integer;
345
+ pos :integer;
335
346
begin
336
347
s := UTF8Encode(val);
337
348
len := Length(s);
338
349
WriteUI32(len);
339
- SetLength(a,len);
340
- CopyMemory(@a[0 ], @s[1 ], len);
341
- WritePipe(self.pipe,a,len);
350
+ pos := 0 ;
351
+ while pos < len do
352
+ begin
353
+ if pos + BLOCK_SIZE <= len then
354
+ blklen := BLOCK_SIZE
355
+ else
356
+ blklen := len - pos;
357
+ CopyMemory(@a[0 ], @s[1 +pos], blklen);
358
+ WritePipe(self.pipe,a,blklen);
359
+ pos := pos + blklen;
360
+ end ;
342
361
end ;
343
362
344
363
procedure TPipeThread.WriteStrings (val: TStrings);
0 commit comments