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/)
-   -   Festplatte /CD-Rom ohne Volumeid? (https://www.delphipraxis.net/162093-festplatte-cd-rom-ohne-volumeid.html)

p80286 5. Aug 2011 17:25

Festplatte /CD-Rom ohne Volumeid?
 
Hallo zusammen,

beim Versuch den Namen einer CD (DISK1) und einer Festplatte (SYSTEM) mit Hilfe von Findfirst/FindNext/Findclose [faAnyFile / if attrib and faVolumeID>0) auszulesen bin ich kläglich gescheitert. Auf die Protokollierung aller Dateien auf der Festplatte/CD ergab keine Datei mit dem Attrib faVolumeid (0x0008).
Kann mir jemand sagen was ich falsch gemacht habe?

Ach ja ich arbeite unter XP. Als "Normalbenutzer"

(zu DOS-Zeiten gab es soetwas noch)

Gruß
K-H

Luckie 5. Aug 2011 17:30

AW: Festplatte /CD-Rom ohne Volumeid?
 
Zitat:

Zitat von p80286 (Beitrag 1115308)
Kann mir jemand sagen was ich falsch gemacht habe?

Und wie sollen wir das machen ohne deinen Code zu sehen? Seit ich wieder eine Freundin habe, sind meine telepathischen Kräfte etwas geschwächt von der Dauernutzung.

himitsu 5. Aug 2011 18:45

AW: Festplatte /CD-Rom ohne Volumeid?
 
DOS ist lange vorbei ... in NT gibt es das nicht mehr.
http://msdn.microsoft.com/en-us/library/gg258117.aspx

NTFS speichert das vermutlich wo anders,
auch CDFS speichert das nicht im Dateisystem,
also wohl nur im alten FAT war es dort zu finden.

http://msdn.microsoft.com/en-us/library/aa364407.aspx
Tipp:
> Du suchst Informationen zu einem Volume :roll:

http://msdn.microsoft.com/en-us/library/aa364993.aspx

PS: Der Volume-Friendly-Name steht nicht unbedingt auf dem Datenträger, denn Windows kann den (im Explorer) angezeigen Namen auch irgendwo in der Regisrty speichern ... hab ich vorallem in Verbindung mit CD-Laufwerken (ohne CD) und bei Speicherkarten erlebt.
Dort kommt man notfalls über WMI ran, falls die genannte API nicht reicht.


Zitat:

Auf die Protokollierung aller Dateien auf der Festplatte/CD
Und selbst wenn du es im Dateisystem findest, dann natürlich nur im Root-Verzeichnis. :angle2:

p80286 5. Aug 2011 21:58

AW: Festplatte /CD-Rom ohne Volumeid?
 
Zitat:

Zitat von himitsu (Beitrag 1115317)
..also wohl nur im alten FAT war es dort zu finden.

So war das

Zitat:

Zitat von himitsu (Beitrag 1115317)
http://msdn.microsoft.com/en-us/library/aa364993.aspx

PS: Der Volume-Friendly-Name steht nicht unbedingt auf dem Datenträger, denn Windows kann den (im Explorer) angezeigen Namen auch irgendwo in der Regisrty speichern ... hab ich vorallem in Verbindung mit CD-Laufwerken (ohne CD) und bei Speicherkarten erlebt.
Dort kommt man notfalls über WMI ran, falls die genannte API nicht reicht.

Das Sieht erfolgversprechend aus, vielen Dank.

Zitat:

Zitat von Luckie (Beitrag 1115310)
Und wie sollen wir das machen ohne deinen Code zu sehen? Seit ich wieder eine Freundin habe, sind meine telepathischen Kräfte etwas geschwächt von der Dauernutzung.

Alles eine Frage des Trainings ;-)

Ich war davon ausgegangen, daß mein Hinweis auf Findfirst... ausreichend war.

Bei CDs könnte die TOC noch eine Quelle sein.

Vielen Dank!

Gruß
K-H

samso 6. Aug 2011 11:36

AW: Festplatte /CD-Rom ohne Volumeid?
 
Vielleicht ist das hier, dass was Du suchst
Delphi-Quellcode:
function VolumeId(const Drive: String): string;
var
  OldErrorMode: Integer;
  NotUsed, VolFlags: Cardinal;
  Buf: array [0..MAX_PATH] of Char;
begin
  OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    Buf[0] := #0;
    if GetVolumeInformation(PChar(Drive), Buf, sizeof(Buf), nil, NotUsed, VolFlags, nil, 0)
    then
      SetString(Result, Buf, StrLen(Buf))
    else
      Result := '';
  finally
    SetErrorMode(OldErrorMode);
  end;
end;

himitsu 6. Aug 2011 12:59

AW: Festplatte /CD-Rom ohne Volumeid?
 
Zitat:

SizeOf(Buf)
Man beachte unbedingt die Beschreibung für nVolumeNameSize

MSDN-Library durchsuchenGetVolumeInformation
Zitat:

The length of a volume name buffer, in TCHARs
TCHAR wurde im MSDN nicht umsonst fett geschrieben.
Also Length und nicht SizeOf.


Genau durch solche Fehler entstehen die meisten vProbleme mit den APIs.
- Entweder funktioniert der Code dann nicht, durch einen vermeintlich zu kleine Buffer,
- oder es gibt ganz besonders schöne Speicherüberläufe, da der Buffer größer angegeben wird, als er wirklich ist.

samso 6. Aug 2011 14:09

AW: Festplatte /CD-Rom ohne Volumeid?
 
Aja, danke! Ich habe meine Bibliotheken immer noch nicht komplett auf Unicode umgestellt.

himitsu 6. Aug 2011 14:32

AW: Festplatte /CD-Rom ohne Volumeid?
 
Wobei es ja eigentlich schon zu Ansi-Zeiten "falsch" war, auch wenn es zufällig funktioniert. :angle2:

p80286 8. Aug 2011 10:03

AW: Festplatte /CD-Rom ohne Volumeid?
 
Vielen Dank für Eure Hinweise. Das hier ist jetzt dabei heraus gekommen:
Delphi-Quellcode:
function GetVolName(Drive:char;out VolSerialNo,FileSystemName:ansistring):ansistring;
var
  DrivePath       : Ansistring;
  MaximumComponentLength : DWORD;
  FileSystemFlags : DWORD;
  VolumeSerialNo  : DWORD;
  buffer1          : array [0..MAX_PATH] of ansichar;
  buffer2          : array [0..MAX_PATH] of ansichar;
  PVolName        : PChar;
  VolumeName      : Ansistring;
  VolumeNameLength : integer;
begin
  Result := '';
  DrivePath := Drive + ':\';
  fillchar(buffer1,Sizeof(buffer1),' ');
  fillchar(buffer2,Sizeof(buffer2),' ');
  GetVolumeInformation(PChar(DrivePath),
                       PChar(@buffer1[0]),
                       Length(buffer1),
                       @VolumeSerialNo,
                       MaximumComponentLength,
                       FileSystemFlags,
                       PChar(@buffer2[0]),
                       Length(buffer2));
  Result:=buffer1;
  VolSerialNo:=inttostr(VolumeSerialNo);
  FileSystemName:=buffer2;
end;
Unter XP/D7 funktioniert es.

Ich habe übrigens keinen Datenträger mehr gefunden, der mit FindFirst und faVolumeID noch ein Ergebnis brachte (Disketten hab ich keine mehr)

vielen Dank nochmal!
K-H


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