Q&A

  • DVD-RAM의 Eject 질문수정
DVD-RAM을 Eject할려구 합니다.

DVD-RAM은 두가지 타입이 있는데요.
DiskType이 드라이브 자체가 별도로 생성이 되는 즉.
CD드라이브와 DVD드라이브가 두개 생성이 되어
CD는 씨디 타입으로 Cd나 DVD를 집어 넣었을때 인식 되며.
다른 한개 드라이브는 DVD-RAM미디어를 넣었을때
이동식 드라이브로 잡히게 됩니다.

mci커맨드는 Cd에서만 동작하기 때문에 전혀 소용이 없구요.
DeviceIO 함수를 이용하는데요. 문제는 CD나 기타 다른 이동식 디스크(USB메모리)는
핸들값을 얻어 와서 IO커맨드를 날릴수가 있는데.
문제는 리턴값이 170=ERROR_BUSY 라고 걸리거든요. 이걸 어떻게 해제 해야 하는지
모르겠습니다.


아시는분의 도움을 부탁드립니다.
(질문을 수정했습니다. 핸들얻어오는건 아래와 같이 파라미터를 바꿔주니깐 되더군요.)

<!--CodeS-->
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);

var
    cd: THandle;
    ret: DWORD;
begin

    cd := CreateFile(PChar('\\.\' + drvChar + ':'), GENERIC_READ, FILE_SHARE_WRITE, nil,
        OPEN_EXISTING, 0, 0);

    if CD <> INVALID_HANDLE_VALUE then
    begin
        // eject or IOCTL_STORAGE_EJECT_MEDIA
            if not DeviceIoControl(cd, IOCTL_DISK_EJECT_MEDIA, nil, 0, nil, 0, ret, nil) then
                AudioInfoMemo.Lines.Add(intToStr(GetLastError));


    end;
<!--CodeE-->



0  COMMENTS