![]() |
wieso werden PChar Werte im dyn. Array gelöscht?
Hi@ll
frage steht oben, hab keine ahnung wieso alle werte auf '' zurück gesetzt werden?! hier der code:
Code:
type
TDrives = record Device : Byte; Drive : PChar; end; TForm1 = class(TForm) private aDrives: Array of TDrives; DriveBtns: Array of TBitBtn; procedure List_Drives; procedure CreateDriveBtns; { Private-Deklarationen } public { Public-Deklarationen } end; const DRIVE_UNKNOWN = 0; DRIVE_NO_ROOT_DIR = 1; DRIVE_REMOVABLE = 2; DRIVE_FIXED = 3; DRIVE_REMOTE = 4; DRIVE_CDROM = 5; DRIVE_RAMDISK = 6; procedure TForm1.List_Drives; begin // speichert den Drive Index und den Laufwerksbuchstaben (zB 'C:\') im aDrives Array end; procedure TForm1.CreateDriveBtns; var i:Byte; begin List_Drives; SetLength(DriveBtns, length(aDrives)); for i := low(aDrives) to High(aDrives) do begin DriveBtns[i] := TBitBtn.Create(self); // <- Nach diesem Befehl werden die Daten im aDrives Array gelöscht (Nur die Laufwerksbuchstaben und nicht die Indexe)?!?! DriveBtns[i].Parent := Panel1; DriveBtns[i].Top := i*30; DriveBtns[i].Caption := string(aDrives[i].Drive); end; end; |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
mich würde der Inhalt von
Delphi-Quellcode:
interessieren. Ich vermute du forderst keinen Speicher für "Drive : PChar;" an.
procedure TForm1.List_Drives;
begin // speichert den Drive Index und den Laufwerksbuchstaben (zB 'C:\') im aDrives Array end; |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Code:
procedure TForm1.List_Drives;
var r: LongWord; Drives: array[0..128] of char; pDrive: PChar; begin SetLength(aDrives,0); r := GetLogicalDriveStrings(SizeOf(Drives), Drives); if r = 0 then Exit; if r > SizeOf(Drives) then raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY)); pDrive := Drives; while pDrive^ <> #0 do begin SetLength(aDrives, Length(aDrives)+1); if GetDriveType(pDrive) = DRIVE_UNKNOWN then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_UNKNOWN; end; if GetDriveType(pDrive) = DRIVE_NO_ROOT_DIR then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_NO_ROOT_DIR; end; if GetDriveType(pDrive) = DRIVE_REMOVABLE then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_REMOVABLE; end; if GetDriveType(pDrive) = DRIVE_FIXED then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_FIXED; end; if GetDriveType(pDrive) = DRIVE_REMOTE then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_REMOTE; end; if GetDriveType(pDrive) = DRIVE_CDROM then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_CDROM; end; if GetDriveType(pDrive) = DRIVE_RAMDISK then begin aDrives[High(aDrives)].Drive := pDrive; aDrives[High(aDrives)].Device := DRIVE_RAMDISK; end; Inc(pDrive, 4); end; SetLength(DriveBtns, Length(aDrives)); end; |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Du kannst das ganze verkürzen...
Delphi-Quellcode:
type
TDrives = record Device: LongWord; Drive: String; end; var Drives: array of TDrives; procedure TForm1.FormCreate(Sender: TObject); var LogicalDrives: DWORD; I: Integer; begin LogicalDrives := GetLogicalDrives; for I := 0 to 25 do if LogicalDrives and (1 shl I) <> 0 then begin SetLength(Drives, Length(Drives) + 1); with Drives[High(Drives)] do begin Drive := Chr(I + Ord('A')) + ':\'; Device := GetDriveType(PChar(Drive)); end; {end with} end; {end if} end; {end procedure} |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Ah thx@Sprint
ich verstehe diese zeile nicht so ganz:
Code:
und diese funktion auch nicht:
if LogicalDrives and (1 shl I) <> 0 then
Code:
also der variablen LogicalDrives wird mit hilfe von GetLogicalDrives ein DWORD-Wert zugeordnet. Was genau bedeutet dieser Wert? Was muss ich genau machen, um möglichst schnell selber auf eine Antwort zu kommen, wo muss man da nachschauen?
GetLogicalDrives
wieso müssen die/beide Bits von LogicalDrives und 1 shl i an irgend einer stelle 1 bzw True sein, damit ein Ergebnis <> 0 zustande kommen kann? (Wenn man den Wert von LogicalDrives versteht, wird man denke ich diese Frage auch beantworten können) Eine letzte Frage noch: Wie kommst du bzw die anderen "cracks" immer auf solche funktionen? man muss doch mal etwas vergessen oder schlägst du die immer nach? Mich Interessiert einfach nur die Methodik, wie man zu solchen Funktionen kommt. |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Zitat:
schnell die Bedeutung der Funktion. Alternativ kannst du nachtürlich auch bei msdn.microsoft.com schauen. Zitat:
Delphi-Quellcode:
if LogicalDrives and (1 shl I) <> 0 then
|
Re: wieso werden PChar Werte im dyn. Array gelöscht?
@n00b2key
Die Ursache deines Probs lag wohl vor allem auch primär daran, dass du "Drive" (:PChar) in dieser vorher aufgerufenen "List_Drives"-Procedure dann jedoch letztlich (mittels pDrive :PChar) nur irgendwo auf eine dort bloß lokale Variable (Drives:array[X..Y]...) pointen ließest. Und lokale Variable lösen sich dann aber immer in Luft auf, wenn die Routine, in der sie standen, schließlich returniert! (...nur der Vollständigkeit halber). |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Aha, thx@ll
Ich saug mir grad dieses SDK ( ![]() |
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Zitat:
|
Re: wieso werden PChar Werte im dyn. Array gelöscht?
Zitat:
wenn du sowas schon eine ganze weile immer machst (durch nachschlagen oder in foren fragen), dann kannst du das bald von ganz allein. das ist, wie autohfahren: wenn du ab und zu eine strecke fährst (von der arbeit nach hause zB), dann kannst du sie schon bald "wie im schlaf" (was natürlich gefährlich wäre ;) ) Aenogym |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 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