я запрашиваю все диски в системе GetLogicalDriveStrings затем получаю их размеры GetDiskFreeSpaceEx но если диска нет в дисководе (например, А:\), то вылазит мессага. Что за идиотизм? нельзя было просто выдать код ошибки? Хотелось бы услышать альтернытивные методы получения размера диска, в которых нет такого идиотизма.
Что за гавH0виндовс? Какой идиот придумывал это кривущее АПИ??? Размер харда напрямую получить нельзя.
Quark > вылазит мессага. Что за идиотизм? нельзя было просто выдать код ошибки? Вызывай так Код (Text): ... invoke SetErrorMode, SEM_FAILCRITICALERRORS push eax invoke GetDiskFreeSpaceEx, ... mov ebx,eax invoke GetLastError mov edi,eax call SetErrorMode test ebx,ebx jz GetDiskFreeSpaceEx_failed_LastError_in_EDI ...
Это, конечно, вариант. Но GetDiskFreeSpaceEx виснет секунды на 3. Если в системе картридер на 8 дисков, то он полминуты будет грузиться.
как те такая CTL'ка: IOCTL_DISK_GET_PARTITION_INFO ? и соответствующая структура: Код (Text): PARTITION_INFORMATION STRUCT ; sizeof = 20h StartingOffset LARGE_INTEGER <> PartitionLength LARGE_INTEGER <> HiddenSectors DWORD ? PartitionNumber DWORD ? PartitionType BYTE ? BootIndicator BOOLEAN ? RecognizedPartition BOOLEAN ? RewritePartition BOOLEAN ? DWORD ? ; padding PARTITION_INFORMATION ENDS PPARTITION_INFORMATION typedef ptr PARTITION_INFORMATION обрати внимание на поле PartitionLength enjoy ЗЫ: если всё таки харда а не раздела то IOCTL_DISK_GET_DRIVE_GEOMETRY и применив несложную арифметику получишь размер харда
Quark Чтобы не боксилась мессага юзай NtSetInformationProcess(ProcessDefaultHardErrorMode). [Уже q_q скозал, только заметил.]
если так уж хочется использовать GetDiskFreeSpaceEx можно попробовать запускать её в отдельном потоке, ждать N миллисекунд, прибивать по таймауту, только с сидюками может быть трабла - вдруг понадобится раскрутить диск? если диска нет в сидюке - то проблем не будет. хотя можно просто проверять тип носителя перед стартом потока. громоздко конечно получицца, но как вариант...