Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi VTOC/Inhaltsverzeichnis einer CD/DVD auslesen (https://www.delphipraxis.net/141666-vtoc-inhaltsverzeichnis-einer-cd-dvd-auslesen.html)

Dalai 15. Okt 2009 19:39

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen
 
Zitat:

Zitat von Garfield
19 Units sind viel.

Das Problem war eben, dass die Units teilweise aufeinander verweisen und man nicht genau weiß, welche davon man nun genau braucht. Dennoch ist das kompilierte Programm nicht sonderlich groß (derzeit knapp 400 KB inkl. inzwischen eingebundenem ListView für die Tabelle), ein Großteil der Units wird demzufolge nicht wirklich gebraucht.

Zitat:

Zitat von Garfield
Die Infos zu den CD/DVDs kann man auch so holen:

So ähnlich macht das die FreeBurner-Lib auch. Da ich aber eh noch das Auslesen des Mediums brauche, hab ich eben die Units eingebunden. Bevor ich da noch welche rausschmeiße und risikiere, dass nichts mehr funktioniert, lass ich es lieber so.

MfG Dalai

Dalai 16. Okt 2009 00:19

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen
 
Ich muss erneut um eure Hilfe bitten, weil ich momentan einen Knoten im Hirn habe und nicht weiterkomme :?.

Ich hab das Programm etwas geändert, und zwar habe ich ein Record definiert, in dem die Daten ankommen:
Delphi-Quellcode:
var PVD : record
        VolDescType   : byte;
        StandardID    : array[2..6] of char;
        VolDescVer    : byte;
        X1             : byte;
        SystemID      : array[9..40] of char;
        VolID         : array[41..72] of char;
        X2             : array[73..80] of byte;
        VolSpaceSize  : array[81..88] of byte;
        X3             : array[89..120] of byte;
        VolSetSize    : array[121..124] of byte;
        VolSequNr     : array[125..128] of byte;
        LogBlockSize  : array[129..132] of byte;
        PathTableSize : array[133..140] of byte;
        TypeLPathTab  : array[141..144] of byte;
        OptTypeLPathTab: array[145..148] of byte;
        TypeMPathTab  : array[149..152] of byte;
        OptTypeMPathTab: array[153..156] of byte;
        DirRecordRoot : array[157..190] of char;
        VolumeSetID   : array[191..318] of char;
        PublisherID   : array[319..446] of char;
        DataPrepID    : array[447..574] of char;
        AppID         : array[575..702] of char;
        CopyFileID    : array[703..739] of char;
        AbstractFileID : array[740..776] of char;
        BibFileID     : array[777..813] of char;
        VolCreation   : array[814..830] of char;
        VolModDate    : array[831..847] of char;
        VolExpirDate  : array[848..864] of char;
        VolEffectDate : array[865..881] of char;
        FilStructVer  : byte;
        X4             : byte;
        AppUse        : array[884..1395] of char;
        X5             : array[1396..2048] of byte;
      end;
Um die Daten dann von dem Pointer Buf auf das Record zu übertragen, habe ich die Methode ReadBtnClick so abgeändert:
Delphi-Quellcode:
if fDrives.Items[DriveCombo.ItemIndex].DeviceReader.ReadData(16, 1, Buf, BufLen) then
begin
     Move(Buf^, PVD, SizeOf(PVD));
end;
Das landet auch alles schön in dem Record. Nur habe ich Schwierigkeiten, die numerischen Felder richtig zu verarbeiten. Konkret geht's mir um die Felder Volume Space Size, Volume Set Size usw. Laut Spec sind diese Felder als Both-byte orders geschrieben:
Zitat:

For example, the decimal number 305419896 has (12 34 56 78 ) as its hexadecimal representation and is recorded as (78 56 34 12 12 34 56 78 ).
Hat jemand eine gute Idee, wie ich das auf einfachem (und verständlichem ;)) Weg in einen Integer umrechnen kann? In meinem DOS-Programm damals habe ich das ebenfalls mit einem Record gemacht, aber da wurden nur die String-Felder weiterverarbeitet (die numerischen wurden nicht benötigt).

MfG Dalai

Klaus01 16. Okt 2009 08:51

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen
 
Guten Morgen,

vielleicht kannst Du mit variant records arbeiten.

Delphi-Quellcode:
type
  TVolSpaceSize = record
    case boolean of
      true: array[0..7] of Byte;
      false: Int64;
  end;
Delphi-Quellcode:
//VolSpaceSize  : array[81..88] of byte;
VoldSpaceSize : TVolSpaceSize;
aber vielleicht gibt es noch eine etwas bessere praktikabelere Lösung.

[edit]
alternativ:
Delphi-Quellcode:
VolSpaceSize  : array[81..88] of byte;
VolSpaceSizeValue: Int64;
..
VolSpaceSizeValue := int64(VolSpaceSize);
Grüße
Klaus

p80286 16. Okt 2009 13:02

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen
 
@Klaus

Ich denke so wäre es besser:

Delphi-Quellcode:
Tvalue : record
    wert : Longint;
    dummy: array [0..3] of byte;
end;
Da der Wert einmal in "intel-Notation" und einmal in "MotorolaNotation" abgelegt wird.

Gruß
K-H

Dalai 16. Okt 2009 14:16

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen
 
Ja, da haut's mich doch vom Stuhl! Ich hatte gestern schon mit Cardinal-Typen statt des array of byte rumgespielt und es hat nicht funktioniert. Lag wohl daran, dass ich die letzten 4 Bytes genommen hatte statt der ersten 4...

"Kaum macht man's richtig, schon funktioniert's" - wie passend die Signatur ist :-D.

Dankeschön an p80286 und Klaus01!

MfG Dalai

Muetze1 16. Okt 2009 14:27

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen
 
Neben den Strukturen hatte ich damals in dem isolib Projekt auch explizite Funktionen zum Umwandeln der Integer bezüglich der Byte Order geschrieben. Diese hat dancemammal auch weiterhin in den Quellen nach der Übernahme der Quellen. Die kannst du nutzen um die Werte hin- und her zu wandeln. Ansonsten kann ich nur noch darauf hinweisen, dass nicht jedes Brennprogramm beide Felder ausfüllt (also mit beiden Byte Order) sondern meist nur eins von beiden. Von daher lohnt es sich immer vorher zu schauen welches Feld <> 0 ist und dann das entsprechende Feld zu nutzen und bei Bedarf zu wandeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.
Seite 2 von 2     12   

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