Avatar billede hermandsen Juniormester
07. december 2003 - 14:54 Der er 8 kommentarer og
1 løsning

TMemoryStream.Size = 0 efter jeg har brugt Write-proceduren

Hej Eksperter!

Jeg skal sende noget buffer via UDP, og har valgt at smide alt det der skal sendes ind i en TMemoryStream, hvorefter jeg bruger SendBuffer i UDP-komponenten. Til at skrive til TMemoryStream'et bruger jeg Write-proceduren...

Jeg vil gerne kunne opnå at have alt buffer inde i TMemoryStream.Memory^, men den er i følge Delphi tom, og TMemoryStream.Size = 0. Hvorfor det!?

Her er lidt kode:

var
  Stream: TMemoryStream;
  BufferInt: Integer;
begin
  Stream := TMemoryStream.Create;
  BufferInt := 214322;
  Stream.Write(BufferInt, SizeOf(BufferInt));
  UDP.SendBuffer(Host, DefaultPort, Stream.Memory^, Stream.Size);
  Stream.Free;
end;

//hermandsen
Avatar billede hermandsen Juniormester
07. december 2003 - 15:26 #1
Okay... Mystisk!!
Hvis jeg bruger ShowMessage(IntToStr(Stream.Size)); så viser den rigtigt nok 4, men hvis jeg markerer Stream.Size og trykker Ctrl+F7 i runtime, så viser den 0!?
Avatar billede hermandsen Juniormester
07. december 2003 - 15:34 #2
Hmmmm... Måske har jeg løst problemet...

SendBuffer har brug for en var-parameter hvor jeg har skrevet Stream.Memory^, hvilket jo ikke kan bruges da den er defineret som property... :)

SendBuffer(Host, DefaultPort, Stream.Memory^, Stream.Size);
Avatar billede bleze Nybegynder
07. december 2003 - 16:34 #3
Det er ikke fordi du ikke har sat Stream.Position := 0 ?
Avatar billede hermandsen Juniormester
07. december 2003 - 16:51 #4
Nope!!
Jeg får stadig intet svar fra UPD-server'en...

Her er hele min procedure:

procedure TExpConnection.Login;
var
  Stream: TMemoryStream;
  Size: Longword;
  Mem: Pointer;
begin
  Stream := TMemoryStream.Create;
  BuildTransportLayer(0, Stream);
  BuildLoginLayer(PChar(Username), PChar(Password), Stream);
  Stream.Position := 0;
  Size := Stream.Size;
  GetMem(Mem, Size);
  CopyMemory(Mem, Stream.Memory, Size);
  SendBuffer(Host, EXP_SERVER_PORT, Mem^, Size);
  FreeMem(Mem);
  Stream.Free;
end;

Jeg tror simpelthen det har noget at gøre med at SendBuffer ikke vil kigge i Mem^ !?
Avatar billede hermandsen Juniormester
07. december 2003 - 22:37 #5
Jaaaaaaaaaaah, jeg har fået det til at virke!!!!!!!
Under min BuildTransportLayer skulle 0 ændres til 1... Pinligt nok!! :)

Nå, men jeg undrer mig stadig over at Stream.Size viser 0 når jeg ser den i Evaluate/Modify ved runtime... Nogen forklaring på det??
Avatar billede borrisholt Novice
08. december 2003 - 08:27 #6
problemet er at Stream.Memory er en untyped pointer. Du ved med andre ord ikke hvad den peger på. Derfor giver det ikke mening at skrive Stream.Memory^ fordi  der beder du om det som Stream.Memory peger på.

Du skal i stedet for have fat i en typed pointer. i dit tilfælde hvor du skal bruge en integer pointer. (PInt)

Så prøv det her :
  UDP.SendBuffer(Host, DefaultPort, pInt(Stream.Memory)^, Stream.Size);

Ikke testet men jeg tror det virker ...

Jens B
Avatar billede hermandsen Juniormester
08. december 2003 - 08:34 #7
>>Jens
Jeg har heldigvis fået løst problemet, men jeg undrer mig stadig over at Stream.Size ikke kan vises rigtigt under Evaluate/Modify. Hvis jeg smider den ind i en ShowMessage kommer den fint nok ud med det rigtige tal, men kigger jeg på den fra Delphi under Runtime (med Evaluate/Modify, Ctrl+F7), så viser den 0!! Hvorfor??
Avatar billede borrisholt Novice
08. december 2003 - 08:37 #8
På grund af din untyped pointer .....

Grunden til at det virker er at det er en integer du peger på .. så går det godtt .. Havde det været et stykke dynanmisk hukommelse så havde sagen været anderledes

Jens B
Avatar billede hermandsen Juniormester
08. december 2003 - 08:44 #9
Okay...
Det skal lige siges at det ikke bare er en integer jeg peger på... Koden i spørgsmålet var blot et eksempel... Det jeg sender ud er 63 bytes stort, og kan variere!!

I midlertid er jeg stødt på et helt andet problem, men det må vist blive til et andet spørgsmål... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester