Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Как получить количество физических жестких дисков?   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
4-1088158566
MetalFan
2004-06-25 14:16
2004.08.08
"повисшее" приложение


1-1090348217
Магнит
2004-07-20 22:30
2004.08.08
Управление окнами в MDI-приложении


3-1089719178
denis24
2004-07-13 15:46
2004.08.08
adotable1.FieldByName( fl_prov ).Asboolean


1-1090514193
saimon
2004-07-22 20:36
2004.08.08
TLabel вместо всплывающей подсказки (Hint)


14-1090359975
НовиЧок
2004-07-21 01:46
2004.08.08
Информация о делфи