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.