Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Den richtigen Computernamen ändern (https://www.delphipraxis.net/70421-den-richtigen-computernamen-aendern.html)

RWarnecke 30. Mai 2006 06:03


Den richtigen Computernamen ändern
 
Hallo,

ich möchte gerne den richtige Computernamen ändern. Ich weiß das ich mit dem Befehl SetComputerName den NetBios-Namen ändern kann. Aber wie kann ich den richtigen Computernamen, also den unter Arbeitsplatz-->Eigenschaften-->Computernamen ändern ?

Ich habe es schon mit SetComputerNameA versucht, aber leider hat das nicht funktioniert. Habt Ihr da vielleicht eine Idee ?

SirThornberry 30. Mai 2006 06:15

Re: Den richtigen Computernamen ändern
 
SetComputerName und SetComputerNameA ist das gleiche.

Basilikum 30. Mai 2006 06:29

Re: Den richtigen Computernamen ändern
 
MSDN-Library durchsuchenSetComputerNameEx

RWarnecke 30. Mai 2006 09:16

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von SirThornberry
SetComputerName und SetComputerNameA ist das gleiche.

Und wie heißt dann der Delphi-Befehl für mein Problem, ich blicke gerade überhaupt nicht durch.

Olli 30. Mai 2006 09:20

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von RWarnecke
Zitat:

Zitat von SirThornberry
SetComputerName und SetComputerNameA ist das gleiche.

Und wie heißt dann der Delphi-Befehl für mein Problem, ich blicke gerade überhaupt nicht durch.

Es gibt zu vielen Funktionen ein Funktionspaar:

"FunctionA" und "FunctionW". Unter Delphi wird der Alias "Function" immer auf "FunctionA" abgebildet. In C/C++ wird der Alias "Function" je nach Einstellung von z.B. _UNICODE auf "FunctionW" oder "FunctionA" abgebildet. Sinn dahinter ist es, gleichzeitig Support für Unicode und ANSI zu bieten. Unicode ist in diesem Fall UCS2.

RWarnecke 30. Mai 2006 16:27

Re: Den richtigen Computernamen ändern
 
Und wie wende ich ich jetzt den Befehl SetComputerNameEx im Delphi an ?

Basilikum 30. Mai 2006 18:37

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von RWarnecke
Und wie wende ich ich jetzt den Befehl SetComputerNameEx im Delphi an ?

diese API ist in der Windows.pas nicht enthalten - demnach selber importieren:
Delphi-Quellcode:
Const
  kernel32                        = 'kernel32.dll';

Type
  COMPUTER_NAME_FORMAT           = (
                                     ComputerNameNetBIOS,
                                     ComputerNameDnsHostname,
                                     ComputerNameDnsDomain,
                                     ComputerNameDnsFullyQualified,
                                     ComputerNamePhysicalNetBIOS,
                                     ComputerNamePhysicalDnsHostname,
                                     ComputerNamePhysicalDnsDomain,
                                     ComputerNamePhysicalDnsFullyQualified,
                                     ComputerNameMax
                                    );


Function                         GetComputerNameEx
                                  (
                                    NameType : COMPUTER_NAME_FORMAT;
                                    lpBuffer : PChar;
                                    Var lpnSize : DWORD
                                  ) : BOOL; StdCall; External kernel32 Name 'GetComputerNameExA';

Function                         SetComputerNameEx
                                  (
                                    NameType : COMPUTER_NAME_FORMAT;
                                    lpBuffer : PChar
                                  ) : BOOL; StdCall; External kernel32 Name 'SetComputerNameExA';

Procedure ???
Begin
  SetComputerNameEx(ComputerNamePhysicalDnsHostname,'Globi');
end;

RWarnecke 31. Mai 2006 16:29

Re: Den richtigen Computernamen ändern
 
Danke, Basilikum. Dein Codebeispiel funktioniert wunderbar. Ich habe mir das auch zusammen mit dem Ausschnitt aus der MSDN für den Befehl SetComputerNameEx angeschaut. Jetzt bleibt nur noch eine Frage offen. Kann ich das gleiche Verfahren auch auf andere Befehle aus der MSDN anwenden ?

Olli 31. Mai 2006 17:33

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von RWarnecke
Kann ich das gleiche Verfahren auch auf andere Befehle aus der MSDN anwenden ?

Ja.

Hier findest unter anderem eine Anleitung wie du die Typen aus dem PSDK in Delphi umsetzt.

RWarnecke 9. Jun 2006 13:12

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von Basilikum
Delphi-Quellcode:
Procedure ???
Begin
  SetComputerNameEx(ComputerNamePhysicalDnsHostname,'Globi');
end;

Warum funktioniert dieser Aufruf nicht mit einer Variable ? Wenn ich statt 'Globi' eine Variable an die Stelle schreibe, streikt die Funktion SetComputerNameEx. Warum ?

fkerber 9. Jun 2006 13:15

Re: Den richtigen Computernamen ändern
 
Hi!

Was heißt "streikt"?
Gibts Fehlermeldungen? Wie sieht die Procedure wirklich aus? (die ??? gehören da ja eigentlich nicht hin, oder?)


Ciao Frederic

RWarnecke 9. Jun 2006 13:22

Re: Den richtigen Computernamen ändern
 
Die Funktion gibt ja TRUE oder FALSE zurück, wenn der Computername gesetzt wurde oder nicht. Die Funktion SetComputerNameEx gibt grundsätzlich TRUE zurück, wenn ich es so schreibe :
Delphi-Quellcode:
SetComputerNameEx(ComputerNamePhysicalDnsHostname,'Globi');
Die Funktion gibt FALSE zurück, wenn ich die Funktion so aufrufe :
Delphi-Quellcode:
SetComputerNameEx(ComputerNamePhysicalDnsHostname,PChar(Name));

// oder :

SetComputerNameEx(ComputerNamePhysicalDnsHostname,Name);
Wobei ich glaube, dass bei der zweiten Version sogar der Fehler aufgetreten ist, das PChar nicht mir String kompatibel ist. Es gibt keinerlei Fehlermeldungen, wenn die Funktion ein FALSE zurückgibt.

jfheins 9. Jun 2006 13:32

Re: Den richtigen Computernamen ändern
 
Probier mal das:

Zitat:

If the function fails, the return value is zero. To get extended error information, call GetLastError.
:roll:

RWarnecke 9. Jun 2006 13:34

Re: Den richtigen Computernamen ändern
 
Wie Du ja schon gesehen hast, bin ich absoluter API-Newbie, könntest Du mir das mal bitte Anhand eines Beispiels erklären mit dem GetLastError ?

Klaus01 9. Jun 2006 13:42

Re: Den richtigen Computernamen ändern
 
Ist eine Delphi Funktion:

Delphi-Quellcode:
Returns the last error reported by an operating system API call.

Unit

System

Category

exception handling routines

function GetLastError: Integer; stdcall;

Description

GetLastError returns the last error reported by an API call into the operating system. Calling this function usually resets the operating system error state.
Grüße
Klaus

Olli 9. Jun 2006 15:45

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von Klaus01
Ist eine Delphi Funktion

Ganz sicher nicht!

Daß MSDN-Library durchsuchenSetComputerNameEx Beschränkungen hinsichtlich des Namens (insbesondere des DNS-Namens) hat, ist dir aber schon beim Durchlesen der Doku klargeworden?

Zitat:

[in] The new name. The name cannot include control characters, leading or trailing spaces, or any of the following characters: " / \ [ ] : | < > + = ; , ?

... übrigens, Rolf, etwas mehr Eigeninitiative können wir wohl von dir erwarten, oder? Kleiner Tip: ich habe lange bevor die DP existierte mit Delphi angefangen, da gab's niemanden der einem irgendwas vorgekaut hat so wie du es willst. Es gilt auch in Foren noch: RTFM - dann fragen.

RWarnecke 9. Jun 2006 16:17

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von Olli
Daß MSDN-Library durchsuchenSetComputerNameEx Beschränkungen hinsichtlich des Namens (insbesondere des DNS-Namens) hat, ist dir aber schon beim Durchlesen der Doku klargeworden?

Zitat:

[in] The new name. The name cannot include control characters, leading or trailing spaces, or any of the following characters: " / \ [ ] : | < > + = ; , ?

Mir ist das schon klar, das SetComputerNameEx Beschränkungen hinsichtlich des Namens hat. Denn ich habe mir die Beschreibung zu dem Befehl schon durchgelesen.

Zitat:

Zitat von Olli
... übrigens, Rolf, etwas mehr Eigeninitiative können wir wohl von dir erwarten, oder? Kleiner Tip: ich habe lange bevor die DP existierte mit Delphi angefangen, da gab's niemanden der einem irgendwas vorgekaut hat so wie du es willst. Es gilt auch in Foren noch: RTFM - dann fragen.

Eigeninitiative zeige ich schon. Denn wenn ich eine Frage hier stelle, dann habe ich schon vorher etwas ausprobiert. Desweiteren, wenn ich nur einen Befehl um die Ohren gehauen bekomme und ich den nicht kenne, dann kann ich ja wohl nach einem kleinen Beispiel fragen, zumal es meine Eigenart ist, dass ich aus einem Beispiel viel besser lerne. Noch dazu fange ich gerade erst an mit der MSDN zu arbeiten. Ich habe die vorher noch nie richtig benutzt oder mir war es nie so richtig bewusst, dass ich eventuell die API benutzt habe. Das heißt ich bin ein absoluter Anfänger. Einem Anfänger gestehe ich schon mal etwas "dumme" Fragen. Es kommt auch noch dazu, das ich nicht nur alleine hier schaue, sondern auch in Google suche und auf andere Delphi-Seiten gehe und mir dort Informationen hole.

So nun aber wieder zum Thema zurrückzukommen. Ich habe mir jetzt mit GetLastError den Fehlercode anzeigen lassen.
Zitat:

Fehlercode 87 ---> ERROR_INVALID_PARAMETER
Dieses ist mir nicht ganz klar. Die Deklaration der Funktion sieht ja so aus :
Delphi-Quellcode:
Function                         SetComputerNameEx
                                  ( 
                                    NameType : COMPUTER_NAME_FORMAT;
                                    lpBuffer : PChar
                                  ) : BOOL; StdCall; External kernel32 Name 'SetComputerNameExA';
Ich rufe die Funktion so auf mit einer Variable Seriennummer, die als String deklariert ist, auf :
Delphi-Quellcode:
SetComputerNameEx(ComputerNamePhysicalDnsHostname,PChar(Seriennummer));
Der Inhalt der Seriennummer entspricht den Regeln aus der MSDN von dem Befehl SetComputerNameEx. Jetzt kommt der oben angegebene Fehlercode. Wenn ich das ganze so aufrufe :
Delphi-Quellcode:
SetComputerNameEx(ComputerNamePhysicalDnsHostname,'Globi');
Dann führt er mir die Funktion einwandfrei aus. Habe ich da irgendwo einen Denkfehler drin, oder mache ich etwas falsch ?

SirThornberry 9. Jun 2006 16:19

Re: Den richtigen Computernamen ändern
 
von welchem Typ ist Seriennummer? und hast du mal debuggt das in Seriennummer auch zu 100% das drin steht was drin stehen soll?

RWarnecke 9. Jun 2006 16:21

Re: Den richtigen Computernamen ändern
 
In Seriennummer stehen zu 100% Sicherheit nur Buchstaben und Zahlen drin und Seriennummer ist nicht länger als 13 Zeichen. Und die Variable Seriennummer ist vom Typ String.

Olli 9. Jun 2006 16:26

Re: Den richtigen Computernamen ändern
 
Zitat:

Zitat von RWarnecke
Das heißt ich bin ein absoluter Anfänger. Einem Anfänger gestehe ich schon mal etwas "dumme" Fragen. Es kommt auch noch dazu, das ich nicht nur alleine hier schaue, sondern auch in Google suche und auf andere Delphi-Seiten gehe und mir dort Informationen hole.

Anfänger seit 1,5 Jahren? Nix für ungut ... :gruebel:

Zitat:

Zitat von RWarnecke
So nun aber wieder zum Thema zurrückzukommen. Ich habe mir jetzt mit GetLastError den Fehlercode anzeigen lassen.
Zitat:

Fehlercode 87 ---> ERROR_INVALID_PARAMETER

Voila, wie schon gesagt, es ist doch der Name. Wie lang ist denn "Seriennummer"? Poste doch mal eine, wo du zahlen duch 123 und Buchstaben durch ABC ersetzt. So können wir uns ein Bild machen ...

Zitat:

Zitat von RWarnecke
Delphi-Quellcode:
SetComputerNameEx(ComputerNamePhysicalDnsHostname,PChar(Seriennummer));

oder
Delphi-Quellcode:
SetComputerNameEx(ComputerNamePhysicalDnsHostname,@Seriennummer[1]);
Zitat:

Zitat von RWarnecke
Der Inhalt der Seriennummer entspricht den Regeln aus der MSDN von dem Befehl SetComputerNameEx.

Unwahrscheinlich, wieso dann ein Fehler?

RWarnecke 10. Jun 2006 08:13

Re: Den richtigen Computernamen ändern
 
Hallo zusammen,

ich danke allen, die hier mir geholfen haben. Ich habe dann letzte Nacht das Problem gefunden. Ich hatte eine Funktion bekommen, mit der ich die Variable Seriennummer gefüllt habe. Habe ich die Variable dann angewendet um den Inhalt in einem Label oder so anzuzeigen, dann hatt alles wunderbar funktioniert, nur halt bei der Funktion SetComputerNameEx nicht. Grund dafür war, der Inhalt der Variable wurde durch die Funktion mit der folgenden Zeile zurückgegeben :
Delphi-Quellcode:
  result := StrPas(PChar(serie));
Habe ich nun das StrPas rausgenommen :wall: , so funktioniert es auch. Das Ergebnis der Funktion ist ja ein AnsiString. Deshalb hat es nicht funktioniert. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 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