![]() |
PChar, PWideChar, Array of Char und Windows API
Hallo zusammen,
ich arbeite gerade mit der Windows API. Jetzt stoße ich dabei auf ein Problem. Aber vorweg, ich rufe die Methode GetUserName auf. Windows benutzt dabei folgende Variablen: LPTSTR lpBuffer LPDWORD lpnSize Nach ein wenig Googlen bin ich auf einen Thread hier im Board gestoßen, indem stand, dass das passende Gegenstück von "LPTSTR" "PChar" ist. Jetzt stellt Delphi aber eine eigene Unit bereit, die die Windows API abbildet. Und dort wird aber statt "LPTSTR" "PWideChar" verwendet. Die erste Frage ist, was der Unterschied von PChar und PWideChar ist. Beides sind doch Pointer mit Nullterminierung der Strings. Da ich aber mit beiden Datentypen einen Fehler bekomme, habe ich mich ein wenig umgeschaut. Fündig bin ich bei Delphi-Treff geworden. Dort wird die Methode wie folgt aufgerufen:
Delphi-Quellcode:
Es wird also ein Array of Char benutzt.
function GetUsername: String;
var Buffer: array[0..255] of Char; Size: DWord; begin Size := SizeOf(Buffer); if not Windows.GetUserName(Buffer, Size) then RaiseLastOSError; //RaiseLastWin32Error; {Bis D5}; SetString(Result, Buffer, Size - 1); end; Und damit geht's dann auch. Jetzt stellt sich mir die Frage, wieso? Wenn ich statt des "Array of Char" eben "PChar" oder "PWideChar" benutze, dann ist nach dem Aufruf von "GetUserName" Buffer leer. Nur mit dem Array of Char steht in Buffer etwas drin. Könnt ihr mir helfen? |
AW: PChar, PWideChar, Array of Char und Windows API
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: PChar, PWideChar, Array of Char und Windows API
Zitat:
Zitat:
Hier wird auch mit PChar gearbeitet, ohne das Speicher angefordert wird: ![]() |
AW: PChar, PWideChar, Array of Char und Windows API
Zitat:
|
AW: PChar, PWideChar, Array of Char und Windows API
Lies doch mal die
![]() Dein festes Array funktioniert da du die Größe schon auf 256 Zeichen festgelegt hast. Den String musst du natürlich auch lang genug machen sonst scheitert die Funktion, wie beschrieben. Ich lasse bei so etwas die Funktion beim ersten mal mit Absicht scheitern da sie mir, laut verlinkter Doku, im Ausgabeparameter
Delphi-Quellcode:
zurückgibt wieviele Zeichen der UserName denn braucht. Und dann kann man seinen String (oder Array) auch so lang machen wie es gebraucht wird und nicht unnötig länger.
lpnSize
[Quote]
Delphi-Quellcode:
procedure printUserName();
var userName: String; buffer: PChar; bufferLen: DWORD; begin bufferLen := 0; GetUserName(nil, bufferLen); userName := String.Create('?', bufferLen-1); buffer := PChar(userName); Win32Check( GetUserName(buffer, bufferLen) ); WriteLn( userName.QuotedString() ); end; |
AW: PChar, PWideChar, Array of Char und Windows API
Und was steht in bufferlen drin, wenn GetuserName fehl schlägt? :roll:
|
AW: PChar, PWideChar, Array of Char und Windows API
Hast Du dir die Deklaration der GetUserName mal angeschaut?
Es gib 2 GetUserName unter Windows: GetUserNameA -> verwendet PAnsiChar, da es die Ansi-Version ist GetUserNameW -> verwendet PWideChar, da es die Wide/Unicode-Version ist AnsiChar = 1 Byte pro Zeichen WideChar = 2 Byte pro Zeichen In den Ansi-Versionen von Delphi wird PChar mit PAnsiChar besetzt und GetUserName verwendet GetUserNameA In den Unicode-Versionen von Delphi wird Pchar mit PWideChar besetzt und GetUserName verwendet GetUserNameW So ist es mit allen Windows-API Befehlen, welche über eine ANSI oder UNICODE (= WideString) Version verfügen. Sprich alle Funktionen, die einen String liefern.. (Nur ne Kurzerläuterung, kein Anspruch auf Vollständigkeit !!) |
AW: PChar, PWideChar, Array of Char und Windows API
Und aus dem Grund nimmt man nicht einfach so blind PWideChar, nur weil der Editor das so anzeigt.
> GetUserName (Ohne A oder W) vom Delphi eine compilerabhängige Weiterleitung und die ist explizit mit PChar deklariert. PS: Genau soein Schrot "falsche Typen" verwendet, waren der Hauptgrund für die D2009-Problemchen. |
AW: PChar, PWideChar, Array of Char und Windows API
Zitat:
Zitat:
Wenn dem so ist, dann verstehe ich auch, weshalb man meistens statt PChar ein Array[0..255] of Char vorfindet. Denn laut Doku ist die Größe von PChar 8 Bit, was ja einer Maximallänge von 256 Zeichen entspricht, welche ja äquivalent zu den 0..255 ist. |
AW: PChar, PWideChar, Array of Char und Windows API
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz