Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать есть ли привод CD-ROM в компе [D6, Win95/98, WinME, NT4, Win2k, WinXP]


maxim2 ©   (2002-12-12 14:14:00) 

Привет всем!
Вот собсно и всё.


ZZ   (2003-02-06 16:17:00) [1]

Интересно все это. А как ваш код справится с тем, что у меня CD-ROM находится в C:\CD\TEAK ?? А вот буковки ему не досталось...

</C:\CD>dir
Том в устройстве C имеет метку SYSTEM
Серийный номер тома: E41C-E7BA

Содержимое папки C:\CD

23.12.2002 07:57 <DIR> .
23.12.2002 07:57 <DIR> ..
26.08.2002 11:33 <JUNCTION> SAMSUNG
13.11.2002 09:41 <JUNCTION> TEAK
23.12.2002 07:57 <JUNCTION> VIRTUAL01
0 файлов 0 байт
5 папок 1 526 981 120 байт свободноCODE>


MARcoDEN   (2003-02-06 10:31:00) [2]

procedure TForm1.Button1Click(Sender: TObject);
var
w:dword;
Root:string;
i:integer;
begin
w:=GetLogicalDrives;
Root := "#:\";
for i := 0 to 25 do
begin
Root[1] := Char(Ord("A")+i);
if (W and (1 shl i))>0 then
if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
Form1.Label1.Caption:=Root;
end;
end;


Centr   (2003-02-04 10:38:00) [3]

>>P@SHA: Сенькс, я выучил паскаль.
>>Diamond Cat: а че ты еще не сказал что перед =надо ставить :, А?


P@SHA   (2003-02-01 16:53:00) [4]

2 Diamonnd Cat: думаю, он догадается, что я имел ввиду...
:)


Diamond Cat   (2003-01-31 23:42:00) [5]

2 P@sha: зря ты в конце многоточие поставил , а то товарищь Centr начнет компилировать, а компилятор ему скажет что нибудь типа "Expression expected but ".." found" опять вопросы пойдут


P@SHA   (2003-01-31 19:54:00) [6]

блин, скобочку одну забыл дописать..
...
if getdrivetype(PChar(dr + ":\")) = ...


P@SHA   (2003-01-31 19:52:00) [7]


> Попробовал ваш инсходник,
> в строке:
> if GetDriveType(dr + ":\") = DRIVE_CDROM then
> выдает ошибку:
> Incompatible types: "Char" and "PChar".
> И че делать?

Попробуй написать
...
if getdrivetype(PChar(dr + ":\") = ...


Игорь Шевченко   (2003-01-21 09:35:00) [8]

Для NT-систем (WinNT, Win2K, WinXP) в кладовке, раздел "Готовые программы" лежит программа QuerySystemInformation, которая определяет, сколько каких устройств в системе находится.


Centr   (2003-01-21 08:15:00) [9]

>>AngeL B.
>>выучить паскаль и исправить элементарную ошибку

И нафига тогда давать нерабочий код?


AngeL B.   (2003-01-20 12:11:00) [10]

выучить паскаль и исправить элементарную ошибку


Centr   (2003-01-20 05:14:00) [11]

Попробовал ваш инсходник,
в строке:
if GetDriveType(dr + ":\") = DRIVE_CDROM then
выдает ошибку:
Incompatible types: "Char" and "PChar".
И че делать?


AngeL B.   (2002-12-15 11:02:00) [12]

Ну что, если диск не отображен на букву, то это значит всего лишь, что в Windows NT Object Manager не прописана символическая связь буквы на устройство, но само устройство там все равно присутствует. Найти его можно в двух папках менеджера.

1) \??
2) \Device

Значатся они под именами Cdrom0, Cdrom1 и т.д.

За более подробной информацией на www.sysinternals.com или найди книгу "Недокументированные возможности Windows NT"


TCrash   (2002-12-15 00:25:00) [13]

Возник связаный вопрос.
Насколько я помню W2k (возможно и ХР) умеет понимать логические диски без буквы. Как быть в таком случае.


Anatoly Podgoretsky   (2002-12-14 11:42:00) [14]

Возврат в виде строки очень удобен, так как сразу отвечает на несколько вопросов есть ли вообще диски
Length=0, тоже о их количестве, и их имена [] и можно обработать все диски в цикле.


AngeL B.   (2002-12-14 11:26:00) [15]


> как правило не достаточно знать есть ли СД, а так же и их
> идентификаторы.

Согласен полностью. Тогда твой второй вариант самый лучший.
Просто заводила темы просил вещь и я ее ему дал.
А про GetLogicalDrives я писал скорее не тебе, а опять же товарищу и иже с ним (ведь людЯм же трудно в MSDN залезть, лучше n раз форум почитать).


Anatoly Podgoretsky   (2002-12-14 00:08:00) [16]

Так чего же ты мне это говоришь, начальный код предложил ты, я предложид дпополнение для твоей реализации или ты просто сомневаешься знаю я или нет про функцию GetLogicalDrives, можно и ее использовать, а затем уже проверять типы по ней, нет проблем. Также вкурсе, что дисков не 26, а 32.
Модернизации предложены совсем с другой целью, как правило не достаточно знать есть ли СД, а так же и их идентификаторы.


AngeL B.   (2002-12-13 23:46:00) [17]


> 2 Anatoly Podgoretsky

Нууу, если будем говорить об универсальности, то давай заодно вспомним, что дисков на самом деле не 26, а 32. Включая экзотические ]:\ [:\ и прочие.
И для начала надо бы определить их наличие функцией GetLogicalDrives.

PS: Между прочим ни Explorer ни FAR их непонимают, несмотря на то, что они есть и доступны из командной строки (cmd.exe).


Anatoly Podgoretsky   (2002-12-12 21:33:00) [18]

Я бы немного модернизировал, что бы было универсальннее

function CdromsNum: Integer;
var
dr: Char;
begin
Result := 0;
for dr:= "a" to "z" do
if GetDriveType(dr + ":\") = DRIVE_CDROM then
begin
Result := Result + 1;
end;
end;

В рехультате будет количество элементов или другой вариант возврщать строку с буквами дисков, Length вернет количество, а сама строка пригодна для работы с дисками без повтороной выборки, тогда


function Cdroms: string;
var
dr: Char;
begin
Result := "";
for dr:= "a" to "z" do
if GetDriveType(dr + ":\") = DRIVE_CDROM then
begin
Result := Result + Dr;
end;
end;


Эти три варианта перекрываю большинство потребностей


maxim2   (2002-12-12 21:19:00) [19]

Спасибо!


AngeL B.   (2002-12-12 15:27:00) [20]



function CdromPresent: Boolean;
var
dr: Char;
begin
Result := false;
for dr:="a" to "z" do
if GetDriveType(dr + ":\") = DRIVE_CDROM then
begin
Result := true;
break;
end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо