Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 6. Jan 2003, 13:23
Moin d3g,

wenn Du folgende Deklaration hast (Voraussetzung: Für Strings ist die Standardeinstellung eingestellt, also string entspricht HugeString/LongString):

Delphi-Quellcode:
var
  sBuffer : string;
dann enthält sBuffer die Adresse des ersten Zeichens des Strings, wenn der String nicht leer ist.

Du könntest also z.B. schreiben:

Delphi-Quellcode:
var
  dwSize : DWORD;

dwSize := MAX_COMPUTERNAME_LENGTH+1;
SetLength(sBuffer,MAX_COMPUTERNAME_LENGTH+1);
GetComputerName(PChar(sBuffer),dwSize);

// oder

GetComputerName(@sBuffer[1],dwSize);
Im ersten Falle wird dem Compiler mitgeteilt, dass er den Pointer sBuffer als PChar verwenden soll. Da dieser auf das erste Zeichen des Strings zeigt klappt der Typecast.

Bei der zweiten Variante wird die Adresse des ersten Zeichens des Strings übergeben. Würdest Du nur @sBuffer schreiben, so würdest Du die Adresse des Pointers (!) übergeben, was ja naheliegender Weise nicht das ist, was Du willst.

Gäbe es nicht die Möglichkeit den Typ string von Longstring auf Shortstring zu ändern, könnte man sogar folgendes in Betracht ziehen:

Man importiert die Funktion selber:

function GetComputerName(const AsName : string;const ApdwSize : PDWORD) : LongBool; stdcall; external 'kernel32.dllname 'GetComputerNameA'; und kann dan sogar folgendes schreiben:

Delphi-Quellcode:
  dwSize := MAX_COMPUTERNAME_LENGTH+1;
  SetLength(sBuffer,dwSize);
  GetComputerName(sBuffer,@dwSize);
Das funktioniert dann, weil sBuffer die Adresse des ersten Zeichens enthält.

Ich hab' jetzt allerdings nicht überprüft, ob bei einer solchen Konstruktion der String auch Nullterminiert ist, wenn man ihn an eine Funktion übergibt, die den Text ausgeben soll, und nicht als Buffer benötigt.

Da standardmässig allerdings alle Longstrings nullterminiert sein sollen würde ich mal davon ausgehen.

Nimmst Du eine Shortstring muss das schiefgehen, da hier nicht auf das erste Zeichen des Strings gezeigt wird, sondern auf die Länge des Strings.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat