CD-ROM-Status abfragen / bdos-befehl / BS-Fehler abfangen



  • Habe folgendes Problem:

    Schreibe eine reine DOS-Anwendung, welches unter anderem alle verfügbaren CD-Rom-laufwerk abfrägt und ggf. daraus einige Daten einliest. Problem an der Sache ist, dass natürlich nicht in jedem Laufwerk eine CD eingelegt ist und daher beim Versuch auf ein leeres LW zu lesen mit einer Fehlermeldung quittiert wird, was natürlich nicht gewünscht wird, da das Programm nach dem Starten keine Usereingabe benötigen soll. (da ggf. durch autoexec.bat gestartet)

    Habe schon diverse Workarounds getestet:

    Lesevorgang mit Try/Catch -> löst keine Ausnahme aus, jedoch erscheint "Critical error ...Ignor Retry ..."

    Öffnen des LW mit system(LW:) erzeugt kein Fehler bzw. gibt kein Fehler zurück.
    Öffnen des LS mit dos_setdrive() und abfragen mit getdrive() "

    und noch einiges mehr, entweder kann kein Fehler abgefangen werden, obwohl kein Datenträger drin ist oder es wird eine Usereingabe wie oben ausgelöst.

    Wenn mir jemand sagen kann ob man diese Usereingae abfangen kann? bzw. was schöner wäre: direkt den Status des CD-Rom-LW abzufragen, habe dafür mal ein wenig mit den bdos-Befehl rumgespielt, jedoch ohne erfolg ...

    Wenn jemand Tipps hätte wäre ich dankbar

    Gruß

    Hilla



  • Habe inzwischen eine Lösung gefunden:

    #include <dos.h>

    struct find_t ffblk;

    int status = _dos_findfirst(Laufwerk,_A_VOLID,&ffblk);

    lasse eben mit diesen Befehl den Volume-Name "suchen", wenn der zurückgegebene Status != 0 dann hat der Datenträger keinen Namen bzw. existiert nicht.
    Nachdem jede CD einen Namen hat, kann man wohl davon ausgehen, dass keine CD eingelegt ist... Ich weiss, nicht schön aber selten 😉

    Wenn jemand eine schönere Lösung hat, nehme ich die natürlich gerne entgegen ...

    Hilla



  • revidiere!

    funktioniert nur in der XP-Console, leider nicht unter DOS 😞

    Naja hoffe, dass ich nicht weiterhin ein Monolog führen muss ...





  • WMI bringt mir leider im Bezug auf reinen DOS-Anwendungen und den damit verbundenen Compiler leider nichts. WMI-Funktionen lassen sich nur in Windows bzw. Windows-Consolen-Awendungen verwenden.

    Aber trotzdem danke für den Tipp! Mit System-Calls am besten bdos-Befehl o. ä. kennst dich nicht aus oder? Damit lässt sich bestimmt irgendwie der Geräte-Status abfragen? Wo sind die alten DOS-C++-Hasen?



  • Hallo Hilla,

    M.E. mußt Du einen eigenen Errorhandler installieren.

    Unter Turbo C 2.0 😉 scheint z.B. sowas zu funktionieren:

    cu, Bernd

    #include <dos.h>
    #include <io.h>
    #include <stdio.h>
    
    int drive = 1;
    
    int errhandler()
    {
    	printf("Drive %c is not ready.\n", 'A' + drive - 1);
    	exit(1);
    }
    
    int main(int argc, char ** argv )
    {
    	char strbuf[5];
    	int ret;
    
    	if ( argc > 1 )
    		drive = atoi(*++argv);
    
    	harderr( &errhandler );
    	sprintf( strbuf, "%c:\\.", 'A' + drive - 1 );
    
    	ret = _chmod(strbuf,0);
    	printf("Drive %c is %sready.\n", 'A' + drive - 1, (ret < 0 ? "not " : "") );
    	return 0;
    }
    


  • danke für deine Antwort,

    der harderr() scheint es in meinem DOS-Compiler (Watcom - verwendet aber auch nur irgendenen Std-DOS-Compiler, ist also nur ein IDE) nicht zu geben. Habe es dann mal mit anderen Error-Handler getestet ohne wahren Erfolg. Einziger Vorteil den ich damit erreicht habe ist, dass das Programm nicht mehr abbricht (immerhin), jedoch erscheint immer noch der Fehler samt Eingabeaufforderung. Danach kann ich einen DOS-Fehler abrufen und das Programm läuft weiter.

    Naja habe mal nach dem harderr gesucht und finde nur Resultate in Verbindung mit OS/2 ?! Habe es auch mal in Turbo C 4.5 getestet, da gibt es ihn auch nicht mehr. -> kein Libary-Klau 😞

    Naja wenn dir ggf. noch was einfallen sollte, würde es mich freuen...

    Gruß

    Hilla

    EDIT: Hab mir mal TC 2 runtergeladen und getestet: tatsache, da funktioniert das so ... mal schauen ob sich da was machen lässt ...



  • Hallo Hilla,

    INT 13 AH=10, Test For Drive Ready funktioniert wohl nicht für CD-Laufwerke.

    Möglicherweise geht das ja irgendwie über IOCTL, INT 21 AH=44.

    Mir erscheint es einfacher auf das Teil zuzugreifen und ggf. den Fehler abzufragen, siehe harderr.

    Wahrscheinlich verbiegt harderr den "Critical Error Handler" via INT 24.

    Ist halt schon etwas länger her 😉

    Schau Dich vielleicht mal hier um:

    http://www.faqs.org/faqs/msdos-programmer-faq/part1/index.html
    http://www.ctyme.com/intr/cat.htm
    http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html
    http://www.borncity.com/Library/DOSProgHB.PDF

    HTH, Bernd


Anmelden zum Antworten