Zna li neko kako da proverim da li su vrata CD-a otvorena ili zatvorena i da li su otkljucana ili zakljucana? Znam kako da ih otvorim/zatvori i otkljucam/zakljucam preko DeviceIOControl, ali ne mogu da nadjem funkciju koja bi mi vratila status.
Stanje vrata od CD-a
Zaključano
Zakačeno
Na ovo sam i ja naleteo trazeci po net-u, ali ovo je namenjeno TurboPascal-u i oslanja se na MSCDEX pod DOS-om, tako da u Delphi-ju nema sanse da ga iskoristim
Ipak bi to moralo da se odradi preko API-ja.
Ja sam dosta davno nešto radio preko MCI (Media Control Interface) sa CD-om.
Zaboravio sam već, pokušaj u Win32 Programmer's Help da pronađeš detalje. Evo ti i primer koda koji sam koristio:
Otvaranje tray-a:
Zatvaranje tray-a:
Edit: Zaboravih - u uses dodaj MMSystem
Zaboravio sam već, pokušaj u Win32 Programmer's Help da pronađeš detalje. Evo ti i primer koda koji sam koristio:
Otvaranje tray-a:
Code:
mciSendString('Set cdaudio door open', nil, 0, 0);
mciSendString('Set cdaudio door open', nil, 0, 0);
Zatvaranje tray-a:
Code:
mciSendString('Set cdaudio door closed', nil, 0, 0);
mciSendString('Set cdaudio door closed', nil, 0, 0);
Edit: Zaboravih - u uses dodaj MMSystem
mciSendString je jedna jako lepo zamisljena stvari, ali je u radu sa CD-om prilicno ogranicena i svodi se samo na multimedialne funkcije, znaci mogu se otvoriti i zatvoriti vrata, pustiti audio CD, proveriti broj pesama isl. ali ovo sto sam pitao nazalost ne moze
Hvala u svakom slucaju na pokusaju da mi pomognes
To Igore radi bez problema preko poziva Win32 na CD, ali mnogo ti je bolje ako pokusas to da odradis preko ASPI (Win9x) ili jos lakse preko SPTI (WinXP, 2003) Imas sve lepo opisano u Windows SDK Help-u. Inace to se radi tako sto proveravas da li je uredjaj On StandBy ili ne jer ti Result onda govori sta se desava sa uredjajem i onda znas sta ti treba.
A ako ne uspes vec ces me naci i kontaktirati
A ako ne uspes vec ces me naci i kontaktirati
Potpis
Imam dva CD uredjaja, kako da odaberem koji da otvorim?
Evo je funkcija koja ti odradjuje posao, samo joj prosledis slovo od drajva:
Ako treba da zatvoris vrata IOCTL_STORAGE_EJECT_MEDIA zameni sa IOCTL_STORAGE_LOAD_MEDIA
Code:
Const
FILE_DEVICE_MASS_STORAGE = $2D;
METHOD_BUFFERED = 0;
FILE_ANY_ACCESS = 0;
FILE_READ_ACCESS = 1;
FILE_WRITE_ACCESS = 2;
IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) OR
(FILE_READ_ACCESS shl 14) OR
($202 shl 2) OR
(METHOD_BUFFERED);
IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) OR
(FILE_READ_ACCESS shl 14) OR
($203 shl 2) OR
(METHOD_BUFFERED);
...
Function EjectCD (Drive : Char) : Boolean;
Var
CD : THandle;
Ret: DWORD;
begin
CD := CreateFile (PChar('\\.\' + Drive + ':'), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
If CD <> INVALID_HANDLE_VALUE Then
Begin
Result := DeviceIoControl(CD, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, Ret, nil);
CloseHandle(cd);
End
Else
Result := False;
End;
Const
FILE_DEVICE_MASS_STORAGE = $2D;
METHOD_BUFFERED = 0;
FILE_ANY_ACCESS = 0;
FILE_READ_ACCESS = 1;
FILE_WRITE_ACCESS = 2;
IOCTL_STORAGE_EJECT_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) OR
(FILE_READ_ACCESS shl 14) OR
($202 shl 2) OR
(METHOD_BUFFERED);
IOCTL_STORAGE_LOAD_MEDIA = (FILE_DEVICE_MASS_STORAGE shl 16) OR
(FILE_READ_ACCESS shl 14) OR
($203 shl 2) OR
(METHOD_BUFFERED);
...
Function EjectCD (Drive : Char) : Boolean;
Var
CD : THandle;
Ret: DWORD;
begin
CD := CreateFile (PChar('\\.\' + Drive + ':'), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
If CD <> INVALID_HANDLE_VALUE Then
Begin
Result := DeviceIoControl(CD, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, Ret, nil);
CloseHandle(cd);
End
Else
Result := False;
End;
Ako treba da zatvoris vrata IOCTL_STORAGE_EJECT_MEDIA zameni sa IOCTL_STORAGE_LOAD_MEDIA