AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Untyped Parameter var Buf

Ein Thema von C0pa · begonnen am 3. Jun 2010 · letzter Beitrag vom 3. Jun 2010
Antwort Antwort
C0pa

Registriert seit: 25. Mai 2010
Ort: Laudenbach
23 Beiträge
 
#1

Untyped Parameter var Buf

  Alt 3. Jun 2010, 11:53
Ola

function callbackSendTo(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr; tolen: Integer): Integer; stdcall; Das ist meine SendTo Methode, jetzt möchte ich den Inhalt von Buf als String zurück gegeben bekommen.
Derzeit mache ich das so:

Delphi-Quellcode:
var s: String;
s := PChar(@Buf);
Witzigerweise erhalte ich mal das richtige Ergebnis und mal nur das erste Byte. Kann jemand sagen was ich ändern muss?

Greez
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Untyped Parameter var Buf

  Alt 3. Jun 2010, 11:59
Zitat von C0pa:
Kann jemand sagen was ich ändern muss?
Nee.

Erstmal wäre es raktisch, wenn du verrätst, wie und mit welchen Werten diese Funktion aufgerufen wird,
eventuell eine Erwähnung der Delphiversionen und was du eigentlich als Ergebnis (in deinem String) erwartest.

eventuell mal so versuchen und das Len mit auswerten
SetString(S, @Buf, Len div SizeOf(Char)); ab Delphi 2009 S als AnsiString oder TRawByteString deklarieren und dann so
SetString(S, Buf, Len); aber dennoch wäre es nicht schlecht, wenn man die Eingangswerte kennt, damit man darauf die passenste Lösung auswählen kann.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Untyped Parameter var Buf

  Alt 3. Jun 2010, 11:59
Durch den Cast auf PChar wird die #0 als Ende der Zeichenkette angesehen. Wenn also irgendwo innerhalb deines Buffers eine #0 ist wird alles dahinter ignoriert. Genauso kann es umgekehrt richtig krachen wenn am Ende deines Buffers keine #0 vorkommt weil dann über den Buffer hinaus gelesen wird um entsprechend eine #0 zu finden und da kann es zur Zugriffsverletzung kommen.
Bei deiner Methode wird mitgegeben wie lang der Buffer ist. Diese Angaben solltest du auch nutzen.
Bytes von einem zum anderen Ort kann man mit move und copymemory kopieren. Der Typ ist in beiden Fällen irrelevant (im Gegensatz zu deinem PChar)

[Edit]
Anstelle von "len" wäre die bessere Bezeichnung "size". Denn len steht für eine Anzahl an Elementen und da spielt es eine Rolle um welchen Typ es sich handelt was deinem Untyped Parameter widerspricht. Size hingegen gibt die Größe an und nicht die Anzahl der Elemente was somit bei Parametern deren Typ keine Rolle spielt zu bevorzugen ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
C0pa

Registriert seit: 25. Mai 2010
Ort: Laudenbach
23 Beiträge
 
#4

Re: Untyped Parameter var Buf

  Alt 3. Jun 2010, 12:10
Habe mir eine Funktion jetzt geschrieben:

Delphi-Quellcode:
function bufferToString(var Buf; Len: Integer): String;
var
  a: array of Byte;
  i: Integer;
begin
  SetLength(a, Len);
  for i := 0 to Len do
    a[i] := PByte(Cardinal(@pchar(buf)) + i)^;
  Result := String(a);
end;
Die Funktioniert wunderbar.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Untyped Parameter var Buf

  Alt 3. Jun 2010, 12:25
dein + i kann glaub ich schief gehen. Denn je nachdem wie PChar in Unicodeversionen definiert ist wird dann um mehr als ein Zeichen weiter gerückt. Verwende doch einfach move oder copymemory
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Untyped Parameter var Buf

  Alt 3. Jun 2010, 12:31
Also ehrlich, man kann's echt übertreiben.

Da gab's doch schon mal so'ne Diskussion mit Zahlen.....


SetString hätte es echt getan, und kostet so gut wie nix.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Untyped Parameter var Buf

  Alt 3. Jun 2010, 12:38
würde dann Bytegenau in Chars umkopieren (auch unter Unicode / ab Delphi 2009)
Delphi-Quellcode:
function bufferToString(var Buf; Len: Integer): String;
var
  i: Integer;
begin
  SetLength(Result, Len);
  for i := 0 to Len - 1 do
    Result[i + 1] := Chr(PByte(@buf)[i]);
end;
würde den Puffer als ANSI ansehn (und ab Delphi 2009 dieses nach Unicode konvertieren)
Delphi-Quellcode:
function bufferToString(var Buf; Len: Integer): String;
var
  S: AnsiString;
  i: Integer;
begin
  //SetLength(S, Len);
  //for i := 0 to Len - 1 do
  // S[i + 1] := PAnsiChar(@buf)[i];
  
  //SetLength(S, Len);
  //Move(Buf, S[1], Len); // optimiertes Kopieren

  SetString(S, @Buf, Len); // oder eben Alles in Einem

  Result := S;
end;
Wie gesagt, ohne Kenntnis der Lage (Eingangswerte, System und Wunschvorstellung über Ausgabewerte)
kann man einfach nix Genaueres sagen.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz