Detection CDROM

Detection CDROM - C++ - Programmation

Marsh Posté le 21-07-2005 à 13:48:19    

Bonjour,
POur mon programme en C++ qui va graver des cd, j'ai besoin de savoir si un cd est insérer dans le lecteur ou pas.J'utilise donc la fonction DiskSize() qui renvoi -1 en cas d'echec. Le truc c que si j'insere un cd vierge, la fonction renvoi également -1 comme si il n'y avait pas de cd.
 
Je cherche donc un moyen de savoir si le cd inséré est vierge en C++...
 
Merci de votre aide!

Reply

Marsh Posté le 21-07-2005 à 13:48:19   

Reply

Marsh Posté le 22-07-2005 à 03:32:46    

mciSendString et MCI_STATUS_MEDIA_PRESENT

Reply

Marsh Posté le 22-07-2005 à 09:53:19    

Salut,
J'ai cherché et j'ai trouvé le code suivant :
 
MCI_STATUS_PARMS Info;
ZeroMemory(&Info, sizeof(Info));
Info.dwItem = MCI_STATUS_MEDIA_PRESENT;
mciSendCommand(mci_cd_device, MCI_STATUS, MCI_STATUS_ITEM,
                              DWORD(&Info));
if(!Info.dwReturn)
  MessageBox(NULL, "Pas de CD détecté !", "", MB_OK);
else
  MessageBox(NULL, "C bon y'a un cd :)", "", MB_OK);
 
 
Mais je trouve pas ou on defini quel lecteur il doit tester .
Je pense que c'est la variable mci_cd_device mais je ne sais po comment lui dire .
 
Merci

Reply

Marsh Posté le 22-07-2005 à 18:18:38    

(Pas testé)

Code :
  1. MCI_OPEN_PARMS params;
  2. MCIERROR       err;
  3. MCIDEVICEID    deviceID;
  4. DWORD          flags; 
  5.    ZeroMemory(&params, sizeof(MCI_OPEN_PARMS));
  6.    params.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;
  7.    flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE;
  8.    err = mciSendCommand(0, MCI_OPEN, flags, DWORD(&params) );
  9.    if (err == MMSYSERR_NOERROR)
  10.       deviceID = params.wDeviceID;
  11.    else
  12.       MessageBox(NULL, "Pas de CD détecté !", "", MB_OK);

Reply

Marsh Posté le 25-07-2005 à 09:39:21    

J'ai rajouté ca dans ton code pou tester:
 

Code :
  1. if (err == MMSYSERR_NOERROR)
  2. {
  3.     deviceID = params.wDeviceID;
  4.     MessageBox(NULL, "Un CD détecté !", "", MB_OK);
  5. }
  6. else
  7.     MessageBox(NULL, "Pas de CD détecté !", "", MB_OK);


 
 
Mais dans tout les cas il me renvois qu'il y'a un cd détecté....
tu defini bien le lecteur qu'il scan grace a DEVTYPE_CD_AUDIO ? de cette facon la :
 

Code :
  1. AnsiString commandeCDROM = "open J:\ type cdaudio alias cdaudio";
  2. mciSendString(commandeCDROM.c_str(), 0, 0, 0);


 
Merci de ton aide!

Reply

Marsh Posté le 01-08-2005 à 13:20:16    

svp..., qqun sait?

Reply

Marsh Posté le 01-08-2005 à 14:59:26    

Avec IOCTL_CDROM_GET_DRIVE_GEOMETRY, tu dois pouvoir déterminer si un CD est présent, ainsi que s'il est vierge ou non.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 01-08-2005 à 18:13:19    

Salut ,
J'ai cherché, mais je ne trouve pas comment utiliser IOCTL_CDROM_GET_DRIVE_GEOMETRY pour detecter si un cd est vierge .
Pourrai tu me donner un code d'exmple, ou me renvoyer vers un site qui en parle si tu trouve.
 
MErci !

Reply

Marsh Posté le 02-08-2005 à 10:45:16    

http://support.microsoft.com/defau [...] -US;138434
Tu peux simplifier l'exemple en virant l'utilisation du fichier (1° CreateFile) et en supprimant les appels à IOCTL_CDROM_MEDIA_REMOVAL qui ne sont pas utiles dans ton cas.
Bon finallement j'ai fait le test, ça marche:

Code :
  1. #include <windows.h>
  2. #include <iostream>
  3. using namespace std;
  4. #define IOCTL_CDROM_GET_DRIVE_GEOMETRY 0x0002404C
  5. int main()
  6. {
  7.     HANDLE hCdrom = ::CreateFile(
  8.         "\\\\.\\Cdrom0",
  9.         GENERIC_READ,
  10.         FILE_SHARE_READ | FILE_SHARE_WRITE,
  11.         NULL,
  12.         OPEN_EXISTING,
  13.         0,
  14.         NULL );
  15.     if ( hCdrom == INVALID_HANDLE_VALUE )
  16.     {
  17.         return 1;
  18.     }
  19.     DWORD           bytes;
  20.     DISK_GEOMETRY   disk_geom;;
  21.     if ( ::DeviceIoControl(
  22.         hCdrom,
  23.         IOCTL_CDROM_GET_DRIVE_GEOMETRY,
  24.         NULL,
  25.         0,
  26.         &disk_geom,
  27.         sizeof disk_geom,
  28.         &bytes,
  29.         NULL ) )
  30.     {
  31.         cout << "CD-ROM present.\n";
  32.         if ( disk_geom.Cylinders.HighPart == 0 &&
  33.              disk_geom.Cylinders.LowPart == 0 )
  34.         {
  35.             cout << "C'est un CD vierge.\n";
  36.         }
  37.     }
  38.     else
  39.     {
  40.         cout << "Aucun CD n'est present.\n";
  41.     }
  42.     ::CloseHandle( hCdrom );
  43. }


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-08-2005 à 11:16:39    

Ca marche !!!
 
Merci beaucoup de ton aide .

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed