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

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

Корректная по времени уснановка Hook'а.


Страницы:   1 2

Riply ©   (2007-04-09 10:33:00) 

Здравствуйте !
Неожиданно(а может и закономерно) столкнулась со следующим фактом:
Пробуем создать процесс и тут же установить на него персональный Hook (WH_SHELL).
type
TSetLibHook = function(const HookType, ThreadId: DWord): DWord; stdcall;

function ExecuteAndSetHook(const ExeName, LibName, FunctName: string; HookID: DWord): Boolean;
var
hLib: THandle;
LastErr: integer;
SetLibHook: TSetLibHook;
Proc_Info: PROCESS_INFORMATION;
begin
Result := False;
hLib := LoadLibrary(PChar(LibName));
if hLib <> 0 then
 try
  @SetLibHook := GetProcAddress(hLib, PChar(FunctName));
  if Assigned(@SetLibHook) then
   begin
    FillChar(Proc_Info, SizeOf(PROCESS_INFORMATION), 0);
    if Process_Create(SpyExeName, '', ExtractFileDir(ExeName), SW_SHOWDEFAULT, Proc_Info) then
     try
//       Sleep(1000);
      LastErr := SetLibHook(HookID, Proc_Info.dwThreadId);
      Log_WriteError('SetLibHook', LastErr);
      Result := LastErr = ERROR_SUCCESS;
     finally
      ProcessInfo_CloseHandles(@Proc_Info);
     end;
   end;
 finally
  FreeLibrary(hLib);
 end;
end;

SetLibHook в Dll'ке:
function Hook_SetThread(const HookType, ThreadId: DWord): DWord; export; stdcall;
begin
pHookData^.Hook := SetWindowsHookEx(HookType, @ShellHookProc, hInstance, ThreadId);
if pHookData^.Hook <> 0 then Result := ERROR_SUCCESS else Result := GetLastError;
end;

Проблемма в следующем:
Если убрать комментарии у  Sleep(1000), то все работает, а если оставить,
то получим ошибку: "The parameter is incorrect".
Мне инересно: это у меня напартачено, или так и должно быть ?
Если так и должно быть, то как подождать возможности безопасно поставить Hook и почему это происходит ?


Сергей М.   (2007-04-09 10:47:00) [21]

hMod

Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULLif the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.


Страницы:   1 2

Наверх

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