Naravno, postoje i drugio načini, npr:
Code:
#include <winioctl.h>
// zatvara
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hDevice;
DWORD bytes;
hDevice = CreateFile("\\\\.\\i:", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL );
DeviceIoControl(hDevice,IOCTL_DISK_LOAD_MEDIA,NULL,0, NULL, 0, &bytes, (LPOVERLAPPED) NULL);
CloseHandle(hDevice);
}
// otvara
void __fastcall TForm1::Button2Click(TObject *Sender)
{
HANDLE hDevice;
DWORD bytes;
hDevice = CreateFile("\\\\.\\i:", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL );
DeviceIoControl(hDevice,IOCTL_DISK_EJECT_MEDIA,NULL,0, NULL, 0, &bytes, (LPOVERLAPPED) NULL);
CloseHandle(hDevice);
}
Razlika je samo u IOCTL_DISK_LOAD_MEDIA i IOCTL_DISK_EJECT_MEDIA.
Primeti takodje slovo
i:. To je konkretna oznaka drajva.
Koje sve drajvove imaš na sistemu, možeš videti sa (stavi prethodno jedan Memo1 na Form1):
Code:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int type;
type = GetDriveType("C");
type = GetDriveType("C:\\Windows");
for ( char c='A'; c<='Z'; c++ )
{
AnsiString S = AnsiString( c ) + ":";
int type = GetDriveType( S.c_str() );
if ( type > 1 )
{
String TypeStr;
switch ( type )
{
case DRIVE_REMOVABLE :
TypeStr = " is removable";
break;
case DRIVE_FIXED :
TypeStr = " is fixed";
break;
case DRIVE_REMOTE :
TypeStr = " is network drive";
break;
case DRIVE_CDROM :
TypeStr = " is CD-ROM";
break;
case DRIVE_RAMDISK :
TypeStr = " is RAM disk";
break;
}
Memo1->Lines->Add(S + TypeStr);
}
}
}
Pa ako hoćeš da izvadiš samo CD uređaje filtriraj po atrinutu DRIVE_CDROM.