![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HOOk & DLL
bloodman © (2003-07-08 21:23:00)
Здравствуйте МАСТЕРА! У меня такая проблема:
Нужно зарегить HOOK на события клавиатуры , который на ходится в dll.Я делаю так:
RegCreateKey(HKEY_CLASSES_ROOT,
"CLSID\{00000007-0003-0005-0409-000004370007}\InProcServer32", Reg);
RegSetValue(Reg, nil, REG_SZ, "hooker.dll", 10);
RegOpenKey(HKEY_LOCAL_MACHINE,
"Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad", Reg);
RegSetValueEx(Reg, "hooker", 0, REG_SZ,
PChar("{00000007-0003-0005-0409-000004370007}"), 38);
Перезагружаю компьютер.Хуки работают несколько секунд, а потом , по-моему, выгружаются из памяти(т.е. не работают).
В чем проблема?
3APA3A (2003-07-10 17:34:00) [1]
Можно... работа с файлами возможна стандартными функциями... проверено...
R4D][ (2003-07-10 10:27:00) [2]
Хм... По-моему нельзя пользоваться pascalевскими функциями в коде библиотеки, попробуй заменить их на CreateFile, WriteFile, ReadFile и т.д. Или просто для теста сделай MessageBox. Просто непредвиденные глюки бывают при использовании стандартных pascalевских функций в библиотеке.
bloodman (2003-07-09 21:04:00) [3]Полный код при тесте у меня был такой:
function HookProc(Code: integer; wParam: Word; lParam: LongInt): LongInt; stdcall;
begin
if not (Code=HC_ACTION) then
begin
Result:=CallNextHookEx(MyHook, code, wParam, lParam);
Exit;
end;
Assig"nFile(F, "c:\test.dat);
if OpenFile(PChar("c:\test.dat"), FStruct, OF_EXIST) = HFILE_ERROR then
ReWrite(F)
else Append(F);
GetLocalTime(STime);
WriteLn(F,"");
( F, "[", STime.wDay, ".", STime.wMonth, ".",
STime.wYear, " ", STime.wHour, ":", STime.wMinute, ":", STime.wSecond, "]")Полный код при тесте у меня был такой:
function HookProc(Code: integer; wParam: Word; lParam: LongInt): LongInt; stdcall;
begin
if not (Code=HC_ACTION) then
begin
Result:=CallNextHookEx(MyHook, code, wParam, lParam);
Exit;
end;
Assig"nFile(F, "c:\test.dat);
if OpenFile(PChar("c:\test.dat"), FStruct, OF_EXIST) = HFILE_ERROR then
ReWrite(F)
else Append(F);
GetLocalTime(STime);
WriteLn(F,"");
WriteLn(F, "[", STime.wDay, ".", STime.wMonth, ".",
STime.wYear, " ", STime.wHour, ":", STime.wMinute, ":", STime.wSecond, "]");
end;
А собственно какая разница , как я определял, главное что этот код работает несколько секунд , а потом не работает.
R4D][ (2003-07-09 19:35:00) [4]
А как ты тогда определил, что хуки работают несколько секунд если у тебя такая простенькая HookProc?
bloodman (2003-07-09 19:25:00) [5]
var
MyHook: HHOOK;
function HookProc(Code: integer; wParam: Word; lParam: LongInt): LongInt; stdcall;
begin
if not (Code=HC_ACTION) then
begin
Result:=CallNextHookEx(MyHook, code, wParam, lParam);
Exit;
end;
end;
begin
MyHook:=SetWindowsHookEx(WH_KEYBOARD, @HookProc, HInstance, 0);
end;
Spawn (2003-07-09 18:16:00) [6]
Приведи код Хука
bloodman (2003-07-09 16:30:00) [7]
Мастера помогите плз.
bloodman (2003-07-08 23:00:00) [8]
Нет.
3APA3A (2003-07-08 22:51:00) [9]
Может что-нибудь с callnexthook?
bloodman (2003-07-08 22:36:00) [10]
Лучше подскажи как сделать, чтобы не выгружалась(работала).
3APA3A (2003-07-08 22:34:00) [11]
Ясно... А насчет того, что они выгружаются из памяти - это можно проверить...
bloodman (2003-07-08 22:25:00) [12]
Я так и делаю. В Dll стоит
KHook:=SetWindowsHookEx(WH_KEYBOARD, @KProc, HInstance, 0);
А код который выше нужен для того, чтобы библиотека грузилась и работала без программы (*.exe).
3APA3A (2003-07-08 22:15:00) [13]
На самом деле. По моему гораздо проще и прозрачнее для программиста использовать SetWindowsHookEx... Пишешь dll-ку с процедурой hook-а и вешаешь ее на что хочешь с помощью этой процедуры...
AkaSaint (2003-07-08 21:46:00) [14]
Я не большой специалист по хукам, просто когда-то интересовался. Почему ты не используешь вызовы WinAPI?