Board index » delphi » HELP (Windows/MCI): how to use the MCI_SysInfo command

HELP (Windows/MCI): how to use the MCI_SysInfo command

Hello to all.

I'm writing a CD Player program under Windows 3.1x, wich uses MCI. I need
to obtain how many CD-ROM drives are installed on a computer (I'm going to
support up to 10 drives). The MCI command MCI_SysInfo should make the job,
shouldn't it? This is my procedure, written in Turbo Pascal for Windows 1.5
(but very easy to understand to C++ programmers, too):

procedure CDROM_Drives_Count;

var Info : TMCI_SysInfo_Parms; Options, Result : Longint;
      Names : array [0..9] of PChar; NrDrives : Longint;
      i, Stop : Byte;

    {I want to query about CD Audio device}
    Info.wDeviceType := MCI_DevType_CD_Audio;
    {I want to know how many drives are installed}
    Options := MCI_SysInfo_Quantity;
    {send the command: by now I don't care about Result; but I have a
doubt: SysInfo is sent directly rather than to a specified device, so I
think I can leave 0 the wDeviceID parameter of mciSendCommand, but I'm not
    Result := mciSendCommand (0, MCI_SysInfo, Options, Longint (@Info));
    {with the MCI_SysInfo_Quantity, lpstrReturn is also used to return a
DWORD, so a Longint}
    NrDrives := Longint (Info.lpstrReturn);
    {now I'm going to get the name of each CD Audio device and put them in
the Names array}
    Options := MCI_SysInfo_Name;
    {I'm going to support up to 10 drives, from 0 to 9, no more}
    if NrDrives > 10 then Stop := 9 else Stop := NrDrives - 1;
    {now repeat this operation Stop + 1 times}
    for i := 0 to Stop do
         {get the name of device i}
         Info.dwNumber := i;
         {send the command}
         Result := mciSendCommand (0, MCI_SysInfo, Options, Longint
         {put the returned name into the Names array; dwRetSize specifies
the size of the returned string}
         StrLCopy (Names[i], Info.lpstrReturn, Info.dwRetSize - 1)

Now I should have the name of each drive in Names[DriveNumber]. I should be
able to get their wDeviceID with the mciGetDeviceID function.

First of all, is this procedure right? Am I mistaking something?

Well, this procedure hangs at two points:
1) Info.wDeviceType := MCI_DevType_CD_Audio;
    Result := mciSendCommand (0, MCI_SysInfo, Options, Longint (@Info));
I tested it a lot of times and I found that the value of Info.wDeviceType
is not the value I want it to assume. It should assume the constant ID of
the "cdaudio" device type, but the program hangs (general protection
fault)! Why?

2) StrLCopy (Names[i], Info.lpstrReturn, Info.dwRetSize - 1)
Why doesn't this statement work? The procedure hangs (general protection
fault)! I really don't know why!

If you can help me, please please please put my e-mail address
( in the Cc: field of the reply. Moreover, if anyone can
suggest any GOOD documentation about MCI devices (with some examples), I'll
be grateful if he could contact me.

Thank you in advance.

Mauro Molinari
Internet e-mail: /


Re:HELP (Windows/MCI): how to use the MCI_SysInfo command

On 8 Aug 1997 14:32:30 GMT, "Mauro Molinari" <> wrote:
ma perche' scrivi in inglese ?

Other Threads