![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Plug&Play и DLL [D3, WinXP]
Yosich © (2007-04-01 12:29:00)Подскажите как мне в моей DLL поставить хук чтобы отследить изменение оборудования. Надо определить когда установлена флэшка в комп.
Сергей М. (2007-04-02 08:55:00) [1]
> Yosich (02.04.07 08:29) [6]
И в этомслучае глобальный хук вовсе не нужен.
Достаточно локального хука.
Установить его нужно на основной поток текущего процесса (т.е. процесса Explorer.exe), поскольку твоя dll будет загружаться именно в осн.потоке.
Yosich (2007-04-02 08:29:00) [2]у меня смысл всего этого заключается в том, что моя DLL регистрируется в системе и грузится с експлорером. у меня самого приложения так такового и нет, только DLL. какие еще могут быть предложения? я в написании DLL не особо силен поэтому другого варианта не знаю.
Сергей М. (2007-04-02 08:22:00) [3]
> а вот хотелось бы вот так
А зачем хук-то ? Тем более глобальный ?
Ведь этот код после установки хука будет работать в каждомGUI-приложении !
А тебе достаточно в своемприложении поймать и обработать сообщение WM_DEVICECHANGE - оно посылается системой каждомуприложению, в т.ч. и твоему.
Так что см. [3]
Yosich (2007-04-02 07:32:00) [4]а вот хотелось бы вот так. Но не работает!
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code = HC_ACTION then
if TMsg(Pointer(lParam)^).message = 537 then begin
//----------
end;
Result:= CallNextHookEx(CommonArea^.HookHandlePlugAndPlay, Code, wParam, lParam);
end;
function SetHookPlugAndPlay(Activate : BOOL): BOOL; stdcall; export;
begin
Result := FALSE;
if Activate then
begin
//GetCurrentThreadId
CommonArea^.HookHandlePlugAndPlay := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, hInstance, 0);
Result := (CommonArea^.HookHandlePlugAndPlay <> 0);
end
else
begin
if CommonArea^.HookHandlePlugAndPlay <> 0 then
begin
Result := UnhookWindowsHookEx(CommonArea^.HookHandlePlugAndPlay);
if Result then
CommonArea^.HookHandlePlugAndPlay := 0;
end;
end;
end;
SlymRO (2007-04-02 07:16:00) [5]Yosich (02.04.07 6:33) [2]
Хук левой прошел :)
type
TForm1 = class(TForm)
private
procedure WMDEVICECHANGE(var Message: TMessage); message WM_DEVICECHANGE;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMDEVICECHANGE(var Message: TMessage);
begin
Application.MessageBox('WMDEVICECHANGE','WMDEVICECHANGE')
end;
Yosich (2007-04-02 06:33:00) [6]когда я ставлю хук на сообщений WM_DEVICECHANGE, прога завершается аварийно при отключении/включении флэшки.
Чапаев (2007-04-01 20:16:00) [7]А при чём тут DLL? Отлавливай сообщение WM_DEVICECHANGE.