Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wieso werden PChar Werte im dyn. Array gelöscht? (https://www.delphipraxis.net/29218-wieso-werden-pchar-werte-im-dyn-array-geloescht.html)

n00b2key 5. Sep 2004 22:24


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;

SirThornberry 5. Sep 2004 22:36

Re: wieso werden PChar Werte im dyn. Array gelöscht?
 
mich würde der Inhalt von
Delphi-Quellcode:
procedure TForm1.List_Drives;
begin
// speichert den Drive Index und den Laufwerksbuchstaben (zB 'C:\') im aDrives Array
end;
interessieren. Ich vermute du forderst keinen Speicher für "Drive : PChar;" an.

n00b2key 5. Sep 2004 23:06

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;

Sprint 6. Sep 2004 00:29

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}

n00b2key 7. Sep 2004 01:18

Re: wieso werden PChar Werte im dyn. Array gelöscht?
 
Ah thx@Sprint

ich verstehe diese zeile nicht so ganz:
Code:
 if LogicalDrives and (1 shl I) <> 0 then
und diese funktion auch nicht:
Code:
GetLogicalDrives
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?

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.

Sprint 7. Sep 2004 01:51

Re: wieso werden PChar Werte im dyn. Array gelöscht?
 
Zitat:

Zitat von n00b2key
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 ist eine WinAPI Funktion. Und wenn du das Platform SDK von Microsoft installiert hast, dann findest sehr
schnell die Bedeutung der Funktion. Alternativ kannst du nachtürlich auch bei msdn.microsoft.com schauen.

Zitat:

The GetLogicalDrives function retrieves a bitmask representing the currently available disk drives.
If the function succeeds, the return value is a bitmask representing the currently available disk drives. Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on.

If the function fails, the return value is zero.
Ich denke jetzt mal, das du jetzt weißt warum ich diese Zeile geschrieben habe...
Delphi-Quellcode:
if LogicalDrives and (1 shl I) <> 0 then

TStringlist 7. Sep 2004 06:09

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).

n00b2key 7. Sep 2004 11:40

Re: wieso werden PChar Werte im dyn. Array gelöscht?
 
Aha, thx@ll

Ich saug mir grad dieses SDK ( http://www.microsoft.com/msdownload/.../psdk-full.htm ) es ist 342MB gross und extrahiert ist es dann ~1,4 Gig...ist das normal oder saug ich mir grad was falsches?

Sprint 7. Sep 2004 15:16

Re: wieso werden PChar Werte im dyn. Array gelöscht?
 
Zitat:

Zitat von n00b2key
ist das normal oder saug ich mir grad was falsches?

Das ist das richtige. Hab ich ja schon öfters im WinAPI Forum auf pb gepostet.

Aenogym 7. Sep 2004 15:33

Re: wieso werden PChar Werte im dyn. Array gelöscht?
 
Zitat:

Zitat von n00b2key
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.

das ist einfach nur erfahrung... :thumb:
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 22:58 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