Thema: Delphi Was passiert hier?

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.107 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 31. Dez 2002, 19:49
Moin Steppo,

ok, dann noch mal von Vorne

Genau wie Luckie würde ich es auch anders machen, als in Deinem Code.

Delphi-Quellcode:
function CurrentComputerName: string;

var
  pComputerName : PChar;
  dwSize : DWORD;

begin
  // Rückgabewert initialisieren
  Result := '';
  // Mindestgrösse gemäss PSDK
  dwSize := MAX_COMPUTERNAME_LENGTH+1;
  // Speicher reservieren (AllocMem initialisiert den Speicher auch gleich auf binär 0)
  pComputerName := AllocMem(dwSize);
  // Resourcenschutzblock (Hier: Sicherstellen, dass der belegte Speicher wieder freigeben wird)
  try
    // Namen auslesen
    if GetComputerName(pComputerName,dwSize) then
    begin
      // Wenn erfolgreich als Rückgabewert setzen
      Result := trim(pComputerName);
    end;
  finally
    // Speicher wieder freigeben (dwSize stimmt wahrscheinlich nicht mehr deshalb die Konstante)
    FreeMem(pComputerName,MAX_COMPUTERNAME_LENGTH+1);
  end;
end;
Genaugenommen erwartet die Funktion als ersten Parameter die Adresse eines Speicherbereiches, in dem die Funktion ihr Ergebnis speichern kann.
Dieses Ergebnis ist dann der Rechnername als nullterminierter String. In C ist es üblich, dass Strings keine Längenangabe haben, sondern ihr Ende durch eine binäre 0 gekennzeichnet wird.
Die Funktion schreibt ab dem ersten durch den Pointer adressierten Byte den Rechnernamen in den Buffer, und am Ende eine binäre 0.
Durch das trim(..) werden die letzten Nullen im String abgeschnitten, und nur der Name zurückgegeben.
Strings (Wichtig: Hugestrings, also standardmässig gesehen die, die als string deklariert werden, nicht die String[..]) in Object Pascal haben einen anderen Aufbau. Hier existiert vor den eigentlichen Daten noch eine Längenangabe und, was hier jetzt nicht so interessant ist, einen Referenzzähler, anhand festgestellt werden kann, ob der String noch benutzt wird oder nicht.
Durch diese Längenangabe benötigt Pascal keine Endekennung.

Der Computername selber steht an verschiedenen Stellen, und ich weiss nicht, von welcher Stelle der stammt, den die Funktion ausliest.

Zur array Deklaration:
Alle API Funktionen, die Werte in übergebenen Parametern zurückliefern, benötigen dazu die Adresse eines Speicherbereiches, an den sie die Daten schreiben können. Dies entspricht den var Parametern in Delphi, die es in C nicht gibt.

Die Funktion hätte man auch so aufrufen können:

Delphi-Quellcode:
function CurrentComputerName: string;

var
  pComputerName : PChar;
  dwSize : DWORD;

begin
  dwSize := MAX_COMPUTERNAME_LENGTH+1;
  Result := StringOfChar(#00,dwSize);
  GetComputerName(@Result[1],dwSize);
  Result := trim(Result);
end;
Würde man sich die Funktion selber importieren, unter Verwendung der "normalen" Deklaration, und nicht die Variante die Borland vorgegeben hat sähe das so aus:

GetComputerName(const pBuffer : PChar;const dwSize : PDWORD)

und müsste dann so aufgerufen werden:

GetComputerName(pBuffer,@dwSize)

da die Funktion ja im zweiten Parameter etwas zurückgeben will, benötigt sie dessen Adresse. Dies hat Borland durch die Verwendung von var Parameter ersetzt, was dann allerdings manchmal dazu führt, dass einige API Funktionen nicht so verwendbar sind, wie von MS vorgesehen.
Dazu müsste man sie sich selber importieren.

Den Rechner umzubenennen, ginge, zumindest unter NT ff, mit NetWkstaSetInfo.
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