Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.035 c
10-1026384652
А. Н. Оним
2002-07-29 17:34
2004.08.08
Возврат DCOM сервером строки


3-1089880727
Алексей
2004-07-15 12:38
2004.08.08
Смерть ADO. Как восстановить?


1-1090922659
FS-DOS
2004-07-27 14:04
2004.08.08
rave


4-1088341154
Прямой
2004-06-27 16:59
2004.08.08
Найти что выведено функцией DrawText


3-1089533322
Wolfram
2004-07-11 12:08
2004.08.08
Крах проги! Проблема с ExecSQL в Paradox!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский