AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

Ein Thema von Dalai · begonnen am 13. Okt 2009 · letzter Beitrag vom 16. Okt 2009
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#11

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 15. Okt 2009, 19:39
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 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
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#12

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 16. Okt 2009, 00:19
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 16. Okt 2009, 08:51
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#14

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 16. Okt 2009, 13:02
@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
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#15

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 16. Okt 2009, 14:16
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 .

Dankeschön an p80286 und Klaus01!

MfG Dalai
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 16. Okt 2009, 14:27
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 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