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
Thema durchsuchen
Ansicht
Themen-Optionen

VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

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

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#1

Re: VTOC/Inhaltsverzeichnis einer CD/DVD auslesen

  Alt 15. Okt 2009, 16:45
Sodele,

der Hinweis von Hobby-Programmierer war gut, denn dadurch bin ich auf die APSI-Lib gekommen, die ein Testprojekt enthält, mit dem man beliebige Sektoren einer CD/DVD auslesen kann. Davon hab ich mir abgeschaut, welche Funktion man verwenden kann/muss, um das Gewünschte zu erreichen.

Da die ASPI-Lib aber einige Nachteile hat (abhängig von installiertem ASPI, kein Auslesen der Laufwerksinfos, also Hersteller, Modell usw.), habe ich dann doch die FreeBurner-Lib genommen. Danke an Sir Rufo an dieser Stelle für den passenden Hinweis darauf.

Nach einer Einbindungsorgie mit derselben habe ich dann endlich erreicht, was ich will - siehe Bild im Anhang. Ich habe noch nie so viele Units eingebunden wie bei diesem Projekt - insgesamt 19 Units allein aus der FreeBurner-Lib. Einige davon habe ich angepasst und die Einbindung von CDDB-Kram usw. rausgeschmissen, damit das nicht ausartet.

Was habe ich benutzt? Recht einfach:
Delphi-Quellcode:
uses [...], Devices, ScsiTypes, CovertFuncs;

type
  TMainForm = class(TForm)
    DriveCombo: TComboBox;
    ResultMemo: TMemo;
    ReadBtn: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure ReadBtnClick(Sender: TObject);
  private
    fDrives: TDevices;
end;

//------------------------------------------------

procedure TMainForm.FormCreate(Sender: TObject);
begin
    fDrives:= TDevices.Create;
end;

//------------------------------------------------

procedure TMainForm.FormDestroy(Sender: TObject);
begin
    if Assigned(fDrives) then
        FreeAndNil(fDrives);
end;

//------------------------------------------------

procedure TMainForm.FormShow(Sender: TObject);
var i : integer;
begin
    for i:= 0 to Pred(fDrives.Count) do
        with fDrives.Items[i].DeviceInfo do
            DriveCombo.Items.Add(Format('%d,%d,%d %s %s (%s)',
                                        [HaId, Target, Lun, DriveName, VendorName, Revision]));
    if DriveCombo.Items.Count > 0 then
        DriveCombo.ItemIndex:= 0;
end;

//------------------------------------------------

procedure TMainForm.ReadBtnClick(Sender: TObject);
const
    BufLen = 2048;
var Buf : Pointer;
    s : string;
    c : char;
    i : DWORD;
    liste : TStringList;
begin
    Buf:= nil;
    ReallocMem(Buf, BufLen);
    try
        if fDrives.Items[DriveCombo.ItemIndex].DeviceReader.ReadData(16, 1, Buf, BufLen) then
        begin
            for i:=0 to BufLen do
            begin
                c:= (PChar(Buf) + i)^;
                (*if c < ' ' then
                    c := ' ';*)

                s:= s + c;
            end;
            liste:= TStringList.Create;
            HexStrToPVD(s, liste);
            ResultMemo.Lines.Assign(liste);
            liste.Free;
        end;
    finally
      ReallocMem(Buf, 0);
    end;
end;
Beim Start wird ein Objekt fDrives erzeugt, das die (optischen) Laufwerke des Rechners enthält, inkl. Infos zu Modell, Hersteller, Firmware usw. Beim Klick auf den Button wird mit der Funktion ReadData der Sektor 16 des Mediums ausgelesen und dann in einen String kopiert.

Um die Daten übersichtlich darzustellen, benutze ich die Funktion HexStrToPVD, die ich aus Längengründen mal weggelassen habe; dort passiert im Prinzip nichts weiter, als die Felder an den Indizes in eine StringListe zu kopieren, damit das Memo sie aufnehmen kann.

Das Ganze läuft auch ohne installiertes ASPI, zumindest auf Win2k und höher, was aber nicht weiter schlimm ist, denn wen interessiert schon Win9x noch? 8)

Was bleibt noch zu tun? Die Umrechnung der numerischen Felder fehlt noch, wie man auch leicht am Screenshot sieht . Und eine übersichtlichere Darstellung in Tabellenform steht auch noch an, aber das dürfte beides machbar sein - falls nicht, werde ich das Forum nochmals nerven .

MfG Dalai
Angehängte Grafiken
Dateityp: png dvdinfo_275.png (11,0 KB, 29x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:34 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-2025 by Thomas Breitkreuz