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

Вниз

оброботка сообщение при записи диска   Найти похожие ветки 

 
menart ©   (2006-01-11 11:51) [0]

Можно ли как-то перехватить или проверить состояние привода когда он пишет диск или простаивает?
Заранее всем спасибо и с прошедшими праздниками!


 
Игорь Шевченко ©   (2006-01-11 11:53) [1]

При записи диска сообщений не посылается. Да и кому их посылать ?


 
Deka ©   (2006-01-11 14:10) [2]

Это что-ли для программного индикатора занятости диска надо?


 
menart ©   (2006-01-11 17:42) [3]

Да нет... Меня один знакомый попросил утилитку сделать для кантроля за продавцами сколько дисков за день записали. Просто его продавцы люди хитрые и крадут деньги. :(


 
Игорь Шевченко ©   (2006-01-11 17:55) [4]

Пираты маст дай


 
Deka ©   (2006-01-11 18:01) [5]

Так тебе CD надо... Я думал хард. Наверное надо разораться как делается запись на CD и перехватить соотвествующие функции. А так как сессий записи на один диск теоретически может быть несколько, то надо еще учитывать выброс диска из привода. Думаю что так. А знакомому напечатай плакатик "Вас снимает скрытая камера!" и делов-то... ;)


 
menart ©   (2006-01-11 18:12) [6]


> Игорь Шевченко ©   (11.01.06 17:55) [4]
> Пираты маст дай

Не обязательно :)
Это небольшая фотостудия по оцифровки видие и фото и записи на диск и копирование дисков (в том числе и дисков клиентов).

Все таки можно проверить как-то состояние диска, что он пишет или обробатывать сообщение что диск записан. Или какие могут быть идеи.
Просто я сам иногда пользуюсь его услугами и как бы хочется его отблагодарить ;)


 
VirEx ©   (2006-01-11 19:11) [7]


>  menart ©   (11.01.06 11:51)

надо просто обслужавать сообщения файлового драйвера


 
menart ©   (2006-01-11 19:21) [8]


> VirEx ©   (11.01.06 19:11) [7]
>
> >  menart ©   (11.01.06 11:51)
>
> надо просто обслужавать сообщения файлового драйвера


С этого места места поподробнее можно? я просто профан в этом деле


 
VirEx ©   (2006-01-11 19:45) [9]

уф... это надо ведь всё вспоминать (у меня был диплом по созданию драйверов в Win):) вобщем вот такая штука:
программа может "общаться" с драйвером через DeviceIoControl, открыть драйвер можно через CreateFile(PChar("\\.\"+
вот пример:
//процедура распечатки ошибки
procedure PrintError;
var
 lpMsgBuf:PChar;
begin
// данная функция позволяет перевести ЛЮБОЙ номер ошибки в строку
FormatMessage(
   FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
   nil,
   GetLastError,   //номер ошибки
   0,              //Язык по умолчанию, можно записать как LANG_NEUTRAL and SUBLANG_DEFAULT
   @lpMsgBuf,      //буфер для записи строки ошибки
   0,              //размер для буфера (т.к. стоит флаг FORMAT_MESSAGE_ALLOCATE_BUFFER, то устанавливаем в 0)
   nil
);

//"добираемся" до объекта Memo через глобальный объект Form1,
//т.к. эта процедура не объявлена в форме Form1
Form1.Memo1.Lines.Add("error: "+lpMsgBuf);

// Освобождаем буфер сообщения
LocalFree( Cardinal(lpMsgBuf) );
end;

procedure TForm1.BtOpenDriverClick(Sender: TObject);
begin
//открытие драйвера
drv := CreateFile(PChar("\\.\"+EdDriverName.Text),      // имя драйвера
                   GENERIC_READ    or GENERIC_WRITE,   // тип доступа
                   FILE_SHARE_READ or FILE_SHARE_WRITE,// атрибуты доступа
                   nil,                                // опции безопасности
                   OPEN_EXISTING,                      // атрибуты открытия
                   FILE_ATTRIBUTE_NORMAL,              // атрибуты типа объекта
                   0);

if drv<>INVALID_HANDLE_VALUE then  // если десткиптор драйвера не ошибочный, то
 Memo1.Lines.Add("=== Driver Open === "+TimeToStr(Now));// добавляем в лог

end;

procedure TForm1.BtCloseDriverClick(Sender: TObject);
begin
//загрытие драйвера
if (drv>0) and (drv<>INVALID_HANDLE_VALUE) then begin
 CloseHandle(drv);//закрываем дескриптор
 Memo1.Lines.Add("=== Driver Close === "+TimeToStr(Now));
 end;

end;

procedure TForm1.BtSendCommandClick(Sender: TObject);
var
 InBuffer,OutBuffer  : array of byte;
 BytesReturned  : cardinal;
begin
//посылка пользовательского кода драйверу,
//если в драйвере не зарегистрирована функция обработки IOCTRL запросов
//(DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=MyCTRLFunction)
//то будет ошибка

//пользовательский код, обрабатываемый в драйвере,
//должна "знать" пользовательская программа, работающая с драйвером
//(или драйвер, также работающий с этим драйвером)
 DeviceIoControl( drv,
                  StrToInt(EdCommand.Text),//пользовательский код
                  InBuffer, sizeof(InBuffer),
                  OutBuffer, sizeof(OutBuffer),
                  BytesReturned,
                  nil );
 if GetLastError=NO_ERROR then begin
   memo1.Lines.Add("Send Command result: In="+PChar(@InBuffer)+" Out="+PChar(@OutBuffer));
   end else
   PrintError;
end;

procedure TForm1.BtReadClick(Sender: TObject);
var
 buffer:Pointer;    //буфер
 readcout:cardinal; //сколько в действительности прочитано байт
 len:cardinal;      //длина буфера
begin
GetMem(buffer,StrToInt(EdReadCount.Text));//выделяем память для буфера
len:=StrToInt(EdReadCount.Text);          //кол-во байт (размер буфера)

ReadFile(drv,buffer^,len,readcout,nil);   //драйверу посылается код IRP_MJ_READ
                                         //и он обрабатывает в соответствующей функции
                                         //зарегестрированной в DriverEntry
                                         //(DriverObject->MajorFunction[IRP_MJ_READ] = MyReadFunction)
if GetLastError=NO_ERROR then
 Memo1.Lines.Add("Read bytes cout="+IntToStr(readcout)+", bytes:"+PChar(buffer))
 else
 PrintError;
FreeMem(buffer);//очищаем буфер
end;

procedure TForm1.BtWriteClick(Sender: TObject);
var
 buffer:Pointer;    //буфер
 writtencout:cardinal; //сколько в действительности записано байт
 len:cardinal;      //длина буфера
begin
GetMem(buffer,StrToInt(EdReadCount.Text)); //выделяем память для буфера
len:=StrToInt(EdReadCount.Text);           //размер буфера = 1 байт
WriteFile(drv,buffer^,len,writtencout,nil);
if GetLastError=NO_ERROR then
 Memo1.Lines.Add("written bytes cout="+IntToStr(writtencout)+", bytes:"+PChar(@buffer))
 else
 PrintError;
FreeMem(buffer);//очищаем буфер
end;


 
VirEx ©   (2006-01-11 19:47) [10]

блин, дык а что маяться, сделай таймер который будет проверять статус CDROM"а:
procedure TForm1.Button2Click(Sender: TObject);
var
o:MCI_OPEN_PARMS;
 s:MCI_STATUS_PARMS;
 
 i:Cardinal;
 str:PChar;
begin
GetMem(str,1024);

// тип устройства
o.lpstrDeviceType:="cdaudio";

//имя устройства в системе (в этом случае диск E:\)
o.lpstrElementName:="e";

i:=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT or MCI_OPEN_TYPE,LongInt(@o));
mciGetErrorString(i,PChar(str),1024);
memo1.Lines.Add(str);

//читаем состояние устройства
s.dwItem:=MCI_STATUS_MODE;
i:=mciSendCommand(o.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM or MCI_WAIT ,LongInt(@s));
mciGetErrorString(i,PChar(str),1024);
memo1.Lines.Add(str);

i:=mciSendCommand(o.wDeviceID,MCI_CLOSE,0,0);
mciGetErrorString(i,PChar(str),1024);
memo1.Lines.Add(str);

FreeMem(str,1024);

//выводим в memo
case s.dwReturn of
MCI_MODE_NOT_READY: memo1.Lines.Add("NOT_READY");
MCI_MODE_PAUSE:     memo1.Lines.Add("PAUSE");
MCI_MODE_PLAY:      memo1.Lines.Add("PLAY");
MCI_MODE_STOP:      memo1.Lines.Add("STOP");
MCI_MODE_OPEN:      memo1.Lines.Add("OPEN");
MCI_MODE_RECORD:    memo1.Lines.Add("RECORD");
MCI_MODE_SEEK:      memo1.Lines.Add("SEEK");
end;

end;


 
VirEx ©   (2006-01-11 19:50) [11]

забыл, надо в uses добавить mmsystem

а вот так можно узнать какие приводы сейчас есть:
procedure TForm1.Button3Click(Sender: TObject);
var
 i, mask : integer;
 s : string;
begin
//находим все устройства
mask := GetLogicalDrives;
i := 0;
while mask<>0 do begin
s:= chr( ord("a") + i ) + ":\";
if (mask and 1) <> 0 then
case GetDriveType(PChar(s)) of
 0               : Memo1.Lines.Add(s + " unknown.");
 1               : Memo1.Lines.Add(s + " not exist.");
 DRIVE_REMOVABLE : Memo1.Lines.Add(s + " removable."); // floppy,zip
 DRIVE_FIXED     : Memo1.Lines.Add(s + " fixed.");
 DRIVE_REMOTE    : Memo1.Lines.Add(s + " network.");
 DRIVE_CDROM     : Memo1.Lines.Add(s + " CD-ROM.");
 DRIVE_RAMDISK   : Memo1.Lines.Add(s + " RAM.");
end;
inc(i); mask := mask shr 1;
end;

end;


 
menart ©   (2006-01-12 10:39) [12]

спасибо! Вечером попробую!



Страницы: 1 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.027 c
15-1141644133
Wolfram
2006-03-06 14:22
2006.04.02
Алгоритм MD5


2-1142441377
Fl@sh
2006-03-15 19:49
2006.04.02
FireBird!!!


2-1142724038
ga3
2006-03-19 02:20
2006.04.02
проблема с ActiveX dll


2-1142502168
Sonnetrut
2006-03-16 12:42
2006.04.02
Привязка файла Excel


2-1142872872
AlexLines
2006-03-20 19:41
2006.04.02
Что это за PrintDialog?