Programm beenden wenn CD ausgeworfen wurde.



  • Ich glaube, dass es ein C++ Builder spezifisches Problem. Deswegen ist das Thema falsch verschoben worden.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum WinAPI in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.





  • Ich darf auch auf unsere FAQ hinweisen:
    http://www.c-plusplus.net/forum/39198



  • *g* 😃

    "von VCL nach WinApi verschoben"
    "von WinApi nach VCL verschoben"

    👍



  • Jansen schrieb:

    Ich darf auch auf unsere FAQ hinweisen:
    http://www.c-plusplus.net/forum/39198

    dieser Hinweis ist super, danke.
    Leider funktioniert es bei mir nicht. WMDeviceChange wird nie aufgerufen.
    Ich habe es wie in diesem Beispiel umgesetzt. Vielleicht hat es auch was mit Windows 7 zu tun.

    // unter private:
    void __fastcall WMDeviceChange(TMessage &Message);
    
    // unter public:
    BEGIN_MESSAGE_MAP
      VCL_MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, WMDeviceChange)
    END_MESSAGE_MAP(TForm)
    
    // in Unit1.cpp
    void __fastcall TForm1::WMDeviceChange(TMessage &Message)
    {  
    
      if (Message.WParam == 32768)
        ShowMessage("CD geladen");
      else if (Message.WParam == 32772)
        ShowMessage("CD ausgeworfen");
    }
    


  • Ich nehme alles zurück. Es funktioniert nur in der virtuellen Maschine nicht. Auf einem normalen PC funktioniert es auch mit Windows 7.

    Danke an alle für die schnelle Hilfe.



  • Leider funktioniert es doch nicht so zuverlässig wie ich es dachte. Manchmal wird die CD erst ausgeworfen und erst danach kommt die Message an, so dass das arbeiten der Nachricht im Programm wieder die Fehlermeldung auswirft, dass die CD nicht vorhanden ist.

    Jetzt habe ich einige Start-CD's von namenhaften Herstellern getestet und manche sperren das Laufwerk solange das Menü-Programm geöffnet ist. Das öffnen des Laufwerks ist in der Zeit nicht möglich. Das habe ich probiert nach einigen Beispielen nach zu programmieren, leider ohne Erfolg.

    HWND LWStatus;
       Cardinal LTemp;
    
       AnsiString file =  "\\.\E:";
       char* cp = new char[ file.Length() + 1 ];
         strcpy( cp, file.c_str() );
      LWStatus = CreateFile(cp,GENERIC_READ || GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
    
      if(LWStatus != INVALID_HANDLE_VALUE)
      {
        DeviceIoControl(LWStatus, 0x2D4804, reinterpret_cast<void *> (static_cast<int> (Lock)), sizeof(Lock), NULL, 0, (unsigned long*)LTemp, NULL);
        CloseHandle(LWStatus);
      }
    

    Ich suche nur eine Möglichkeit, dass das Programm sich automatisch schließt, wenn die CD ausgeworfen wird. Oder halt erst garnicht auswerfen läßt wenn das Programm noch läuft.

    Gestern habe ich die Testversion von VS 2010 Professional herunter geladen. Damit eine MFC Anwendung erstellt und SWAPRUN aktiviert. Das Problem bleibt aber auch damit bestehen. Sobald die CD ausgeworfen wird, kommt eine Fehlermeldung von Windows obwohl das Programm einwandfrei weiter läuft.



  • Mit dieser Funktion funktioniert nun das Sperren. Beim Beenden der Anwendung einfach mit false wieder freigeben.

    bool __fastcall TForm1::LockMedia(char ADriveLetter, bool Lock)
    {
       char szDevice[10];
        wsprintf( szDevice,"\\\\.\\%c:", ADriveLetter );
    
        HANDLE hDevice = CreateFile(
             szDevice,     // // drive to open... format is "\\.X:"
             GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
             NULL,    // default security attributes
             OPEN_EXISTING,  // disposition
             0, NULL
        );
        DWORD                 nJunk;
        PREVENT_MEDIA_REMOVAL rPMR;
        rPMR.PreventMediaRemoval= Lock; // TRUE or FALSE
    
        BOOL fResult= DeviceIoControl(
             hDevice, IOCTL_STORAGE_MEDIA_REMOVAL,
             &rPMR, sizeof(rPMR), NULL, 0, &nJunk, NULL
        );
    
       CloseHandle( hDevice );
       return fResult;
    }
    


  • Ich habe noch eine Frage zu dem Thema CD/DVD-Laufwerk. Weiß jemand wie man es mit voller Geschwindigkeit drehen lassen kann? Ich habe probiert einfach die Dateien immer wieder zu lesen, aber ohne Erfolg. Und wenn es sich gedreht hat, dann nur kurz und langsam.


Anmelden zum Antworten