Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизКак получить количество физических жестких дисков? Найти похожие ветки
← →
Nomolos (2004-06-26 20:48) [0]subj
← →
Mim1 © (2004-06-26 21:16) [1]
var
c:cardinal;
b:byte;
i:integer;
const drvs="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
begin
i := 0;
c:=GetLogicalDrives();
for b:=1 to 26 do
begin
if c and 1 = 1 then
begin
s:=drvs[b]+#$9;
if GetDriveType(pchar(drvs[b]+":\")) = DRIVE_FIXED then inc(i);
end;
c:=c shr 1;
end;
end;
← →
Игорь Шевченко © (2004-06-26 21:31) [2]Nomolos (26.06.04 20:48)
> Как получить количество физических жестких дисков?
Для NT-систем: http://www.schevchenko.net.ru/SRC/DeviceIoControl_60.zip +
http://www.schevchenko.net.ru/SRC/Common_60.zip
← →
Ihor Osov'yak © (2004-06-26 22:22) [3]для W9X - к сожалению только через соотв. функции int13, к которым из win32 посредством VWIN32 обратиться то можно, но для HDD они будут неработоспособны. C int13 под W9X можно нормально работать либо с vxd, либо с 16-битной dll.
2 [1] Mim1 © (26.06.04 21:16)
Не факт, что физический диск будет иметь хотя бы один логический том.
Не факт, что физический диск будет иметь только один логический том.
← →
Anatoly Podgoretsky © (2004-06-26 23:26) [4]И не факт, что логический диск занимает один физизический, есть жа RAID
← →
GuAV © (2004-06-27 00:23) [5]Может вы ещё скажете что нет надёжного способа узнать их количество?
← →
Игорь Шевченко © (2004-06-27 00:25) [6]
> Может вы ещё скажете что нет надёжного способа узнать их
> количество?
Для NT-систем я знаю, что есть. Для Win9x не знаю, как, но тоже есть.
← →
Ihor Osov'yak © (2004-06-27 00:32) [7]2 GuAV © (27.06.04 00:23) [5]
> Может вы ещё скажете что нет надёжного способа узнать их количество?
У меня сложилось впечатление, что никто такого не утверждал.
← →
GuAV © (2004-06-27 00:40) [8]
> никто такого не утверждал.
Поэтому я и спросил, чтоб уже была определенность можно/нет
← →
GuAV © (2004-06-27 00:42) [9]Изините, я невнимательно прочитал Ihor Osov"yak © (26.06.04 22:22) [3]
← →
Nomolos (2004-06-27 10:29) [10]Пример Игоря Шевченко DeviceIOControl помогает мне уже давно, огромное за это спасибо, но получить количество HDD так же, как в демонстрации, не получается...
Вот шмат кода (упрощённый вариант), где я напутал?
type
SYSTEM_CONFIGURATION_INFORMATION = packed record
DiskCount : ULONG;
FloppyCount : ULONG;
CdRomCount : ULONG;
TapeCount : ULONG;
SerialCount : ULONG;
ParallelCount : ULONG;
end;
TNtQuerySystemInformation = function(SystemInformationClass: LongInt;
SystemInformation: Pointer; SystemInformationLength: ULONG;
ReturnLength: PDWORD): Integer; stdcall;
var
sci: SYSTEM_CONFIGURATION_INFORMATION;
dw: DWORD;
hDLL: THandle;
NtQuerySystemInformation: TNtQuerySystemInformation;
i: Integer;
begin
hDLL := GetModuleHandle("ntdll.dll");
if hDLL <> 0 then begin
@NtQuerySystemInformation := GetProcAddress(hDLL,
"NtQuerySystemInformation");
NtQuerySystemInformation(7, @sci, SizeOf(sci), @dw);
if dw = 0 then
for i := 0 to sci.DiskCount - 1 do
ListBox1.Items.Add("Физический диск " + IntToStr(i));
FreeLibrary(hDLL)
end
end;
Библиотека открывается, даже функция считывается, однако в dw выдаёт совсем не ноль... Возможно, я неправильно осуществляю вызов? Вроде-бы, старался сделать, как в примере, там работает, культурно возвращает два диска...
← →
Игорь Шевченко © (2004-06-27 23:19) [11]
> однако в dw выдаёт совсем не ноль
dw должна быть равна SizeOf(sci) вообще-то, а не 0.
нулем должно быть значение самой функции
← →
Sanek_metaller © (2004-06-28 00:47) [12]Открыть "Мой компьютер" и посчитаь:)
← →
Nomolos (2004-06-28 10:23) [13]В "Моём компьютере" логические диски, их можно и програмно посчитать, как два пальца.
dw = 0 - это из NtDll.pas, но всё равно в dw - какое-то дикое значение, отличное от sizeof(sci), а структура не заполняется
← →
Игорь Шевченко © (2004-06-28 10:32) [14]
> dw = 0 - это из NtDll.pas, но всё равно в dw - какое-то
> дикое значение, отличное от sizeof(sci), а структура не
> заполняется
У тебя же мой код есть - ищи разницу, мой пример работает
← →
Nomolos (2004-06-28 18:45) [15]В том и трабл, что функции даются те же параметры... Ещё поискать попробую. Может, чего не так, я даже проследил, есть ли там инициализация, может, не сделал...
← →
Nomolos (2004-06-29 10:30) [16]Извиняюсь за флэйм в этой теме, но я наконец разобрался, в чём дело. Оказывается, NtQuerySystemInformation просит конкретный указатель, а не ссылку на переменную. Казалось бы, разницы почти нет, а эффект налицо. Надо объявлять переменную psci типа PSYSTEM_CONFIGURATION_INFORMATION, выделять память и давать этот указатель вместо @sci. Возможно, кому-то пригодится...
← →
Игорь Шевченко © (2004-06-29 16:10) [17]
> Оказывается, NtQuerySystemInformation просит конкретный
> указатель, а не ссылку на переменную. Казалось бы, разницы
> почти нет, а эффект налицо. Надо объявлять переменную psci
> типа PSYSTEM_CONFIGURATION_INFORMATION, выделять память
> и давать этот указатель вместо @sci.
Глупость.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c