Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2011, 03:52   #1
chessnokk
Новичок
Джуниор
 
Регистрация: 22.06.2011
Сообщений: 2
По умолчанию Отловить подключение SD через картридер

Здравствуйте уважаемые гуру.
Помогите я в тупике.
Пишу прогу которая должна отлавливатьподключение гибких дисков будьто флешки, cd, dvd b прочие карты памяти.
Отслеживаю подключение и отключение при помощи WM_DEVICECHANGE
но вот проблемма при подключении карт(SD,MMC и тп) через картридер WM_DEVICECHANGE не реагирует.
Пробывал решить проблему через функцию registerdevicenotification, все равно не видет
Подскажите как быть?

Вот код(пока только проверка на наличие рееакции при подкл)
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,SetupApi;





type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
  public
      procedure WMDEVICECHANGE(var MSG:TMessage); message WM_DEVICECHANGE;
    { Public declarations }
  end;

var
  Form2: TForm2;
  dbi: PDEV_BROADCAST_HANDLE;
implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  registerdevicenotification(Handle, @dbi, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
end;



procedure tForm2.WMDEVICECHANGE(var MSG:TMessage);
begin
    ShowMessage('insert');
end;


end.
chessnokk вне форума Ответить с цитированием
Старый 22.06.2011, 20:28   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

dbi нужно правильно инициализировать
http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
f.hump вне форума Ответить с цитированием
Старый 23.06.2011, 08:14   #3
chessnokk
Новичок
Джуниор
 
Регистрация: 22.06.2011
Сообщений: 2
По умолчанию

Попробывал.
Опираять на статьи
http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx и
http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx(как вы посоветовали)
Сделал так
Код:
type

  _DEV_BROADCAST_HDR = record
    dbch_size, dbch_devicetype, dbch_reserved:DWORD;
   end;
dbi
Код:
  dbi:  _DEV_BROADCAST_HDR;
форм креет
Код:
  dbi.dbch_devicetype:=StrToInt('0x00000005');
  registerdevicenotification(Handle, @dbi, 4);
Всё равно не реагирует. Можд гдето ошибся .не знаю
chessnokk вне форума Ответить с цитированием
Старый 23.06.2011, 12:13   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а если так:
Код:
dbi: DEV_BROADCAST_DEVICEINTERFACE;

ZeroMemory(@dbi,sizeof(DEV_BROADCAST_DEVICEINTERFACE));

dbi.dbcc_size:= sizeof(DEV_BROADCAST_DEVICEINTERFACE);
dbi.dbcc_devicetype:= 5;

Последний раз редактировалось f.hump; 23.06.2011 в 12:29.
f.hump вне форума Ответить с цитированием
Старый 29.06.2011, 15:53   #5
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

А там по другому работает вроде.

Когда подключается кардридер, то в системе проскакивают события (6-7-10 раз, в зависимости от количества дырок в кардридере) о подключении нового устройства.
Так вот все они будут как раз таки выдавать событие
DBT_DEVICEARRIVAL с кодом состояния $8000.

При этом система не делает проверку на наличие или отсутствие диска в дырке.
Иными словами она не интересуется содержимым, т.к. на плате карридера есть котроллер который при поключении к ПК "сказал" -"я-устройство USB" (грубо говоря).

А с задачей "узнать вставили ли карту в дырку" уже не решить так просто, ибо при вставке карты (!!!!) событий никаких не возникает.

Чтобы узнать есть ли в дырке карта можно на таймер повесить:
Код:
/////////////////////////
//проверка наличия диска (для составных устройств, коим является кардридер)
//////////////////////////
function tform1.DiskInDrive(const Drive: Char): Boolean;
var
 DrvNum: Byte;
 EMode: Word;
begin
 Result:= False;
 DrvNum:= Ord(Drive) - Ord('A') + 1;
 EMode:= SetErrorMode(SEM_FAILCRITICALERRORS);
 try
  if DiskSize(DrvNum) =  -1 then
   Result:= True;
 finally
   SetErrorMode(EMode);
 end;
end;
НО!
Я пишу это основываясь на опыте юзания всего 1 модели от Teac.
Я вполне допускаю, что есть модели кардридеров, которые сами сообщают о втыкании карты.

Но у меня было так.
Dee63 вне форума Ответить с цитированием
Старый 22.02.2013, 23:26   #6
Ruzzz
 
Регистрация: 14.10.2008
Сообщений: 6
По умолчанию

Эта страница в выдаче гугла одна из первых, поэтому оставлю ссылку на решение которое нашел http://stackoverflow.com/questions/3...ve-card-reader
Ruzzz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подключение двух компьютеров к интернет через одно подключение Chudo4258 Помощь студентам 3 30.03.2010 16:07
картридер Chudo4258 Помощь студентам 1 12.02.2010 21:21
подключение через минипорт benjaminfran Работа с сетью в Delphi 3 14.02.2008 21:54
Подключение через proxy Рустам Работа с сетью в Delphi 2 15.11.2007 12:45
Подключение через WinInet SHEI'TI Работа с сетью в Delphi 1 15.02.2007 19:53