Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > CopyFile и сd/dvd - rom


Автор: Proxin 6.4.2013, 23:24
Имеется диск в приводе dvd, с него копируется файл на компьютер с помощью фукции CopyFile. Если вытащить диск до завершения процессса копирования, то вылетает стандартная виндовая ошибка (вставьте диск в устройство). Как её подавить? Пробовал
Код

try
{
CopyFile(from,to,0);
}
catch (...)
{
MessageBox(0,"Не получилось скопировать файл",0,0);
}

Не работает, всё равно вылетает "вставьте диск в устройство". Как ловить эту ошибку?

Автор: Alca 7.4.2013, 11:59
Код

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

Автор: Proxin 8.4.2013, 01:46
Спасибо, помогло. Вопрос решён.

Автор: HANDLE 9.4.2013, 14:00
Можно сделать еще круче: заблокировать кнопку извлечения диска на время копирования, тогда юзер не сможет помешать этому процессу.

Код

#include <winioctl.h>

void fun()
{
// G: - привод CD/DVD
  HANDLE hDrive = CreateFile(_T("\\\\.\\G:"), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
  if ( hDrive != INVALID_HANDLE_VALUE )
  {
    PREVENT_MEDIA_REMOVAL pmr = { TRUE }; 
    DWORD dwBytesReturned;
    BOOL bOK = DeviceIoControl(hDrive, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL);
// bOK == TRUE кнопка извлечения диска заблокирована

// TODO: copy from drive

// не забываем разблокировать кнопку
    pmr.PreventMediaRemoval = FALSE;
    bOK = DeviceIoControl(hDrive, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL);

    CloseHandle(hDrive);
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)