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


Автор: alrud 16.8.2007, 14:33
Как к примеру определить есть ли диск в приводе или нет? Не могу избавится от сообщения об ошибке диска. 

Код

bool IsDriveReady(AnsiString drive)
{

        Word old_em = SetErrorMode(SEM_NOOPENFILEERRORBOX);
        bool result;

        if (chdir(drive.c_str()))
        {
                result = false;
        }
        else
        {
                result = true;
        }

        SetErrorMode(old_em);
        return result;

}


Где ошибка? Помогите?

Автор: Rekah 16.8.2007, 15:14
А полный код можно. Просто мне интересно smile

Автор: 586 16.8.2007, 15:27
SetErrorMode(SEM_FAILCRITICALERRORS)

Автор: alrud 16.8.2007, 16:46
Спасибо 586 всё теперь работает!

Это пока полный код функции, конечно он будет чуток дописан

Автор: Alca 30.3.2010, 16:15
У меня этот код не работает. 
Вываливается мсжбокс при обращении к флопу (A:).
Флоп в биосе вкл, физически отсоединен.

Автор: Alca 30.3.2010, 16:32
WinXP SP3, C++Builder 2010

Автор: GremlinProg 30.3.2010, 16:36
можно подергать драйвер:
Код

HANDLE hFile    = ::CreateFile( TEXT("\\\\.\\A:"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
...
::CloseHandle( hFile );

в сочетании с чем-нить навроде такого: http://msdn.microsoft.com/en-us/library/aa363147(VS.85).aspx

Автор: Alca 30.3.2010, 16:46
Код

BOOL bRes = FALSE;

HANDLE hFile = ::CreateFile(_T("\\\\.\\A:"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile) {
    return FALSE;
}

::CloseHandle( hFile );

return TRUE;

Не катит - выскакивает тот же мсжбокс....

Автор: Alca 30.3.2010, 17:10
Код

    BOOL bRes = FALSE;

    WORD usOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);

    try {
        HANDLE hFile = ::CreateFile(_T("\\\\.\\A:"), 
                                   GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (INVALID_HANDLE_VALUE != hFile) {
            ::CloseHandle(hFile);

            bRes = TRUE;
        } else {
            bRes = FALSE;
        }


    } catch (...) {
        bRes = FALSE;
    }

    ::SetErrorMode(usOldErrorMode);

    return TRUE;

Аналогично..  smile  smile  smile 

Автор: SenkraD 30.3.2010, 17:14
Alca,  тут нужно ловить SEH исключение. http://msdn.microsoft.com/en-us/library/9xtt5hxz(VS.71).aspx

Автор: Alca 30.3.2010, 17:29
Код

//--------------------------------------------------------------------------
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {
   ::MessageBox(0, _T("in filter."), _T("filter"), MB_OK);

   if (code == EXCEPTION_ACCESS_VIOLATION) {
      ::MessageBox(0, _T("caught AV as expected."), _T("filter"), MB_OK);

      return EXCEPTION_EXECUTE_HANDLER;

   } else {
      ::MessageBox(0, _T("didn't catch AV, unexpected."), _T("filter"), MB_OK);
      
      return EXCEPTION_CONTINUE_SEARCH;
   }
}
//--------------------------------------------------------------------------
BOOL bIsReady(const tstring &csDrivePath) {
    BOOL bRes = FALSE;

    WORD usOldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOOPENFILEERRORBOX);

    __try {
        HANDLE hFile = ::CreateFile(_T("\\\\.\\A:"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (INVALID_HANDLE_VALUE != hFile) {
            ::CloseHandle(hFile);

            bRes = TRUE;
        } else {
         bRes = FALSE;
        }
    } __except (filter(GetExceptionCode(), GetExceptionInformation())) {
        bRes = FALSE;
    }

    ::SetErrorMode(usOldErrorMode);

    return TRUE;
}
//--------------------------------------------------------------------------

http://msdn.microsoft.com/en-us/library/s58ftw19(v=VS.71).aspx
Таже хрень. Или не так надо?

Автор: Alca 30.3.2010, 17:44
Этот скрипт отрабатывает нормально - без мсжбоксов  smile 
Код

Function IsDriveReady(strDrive)
    Dim objFSO, objDrive, bolReady
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objDrive = objFSO.GetDrive(strDrive)
    If objDrive.IsReady Then
        bolReady = True
        MsgBox("Yes")
    Else
        bolReady = False
        MsgBox("No")
    End If
    IsDriveReady = bolReady
    Set objDrive = Nothing
    Set objFSO = Nothing
End Function


IsDriveReady("A:")

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