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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2014, 13:53   #1
daemon-rm
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 25
По умолчанию Глобальная переменная и hookproc

Всем привет. Делаю хук на окно explorer.exe. Весь код находиться в dll. В dll передаю handle нужного мне окна и присваиваю его к глобальной переменной. В функции хука эта глобальная переменная равна 0, хотя в других моих функциях такого не наблюдается. Почему так происходит?

Код:
var Dll_Hook: HHOOK = 0;
    Wnd: HWND;

function Dll_HookFunc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall; 
  var CWP: TCWPStruct;     
begin
   if nCode=HC_ACTION then begin
     CWP:= PCWPStruct(lParam)^;
     if CWP.hwnd = wnd then	//wnd = 0 почему?
       case CWP.message of
         WM_MOVE: begin
           
         end;
       end;
    end;
   Result:=CallNextHookEx(WH_CALLWNDPROC, nCode, wParam, lParam);
end;

function SetHook(HookWnd: HWND): Boolean;
  var dwThreadID: DWORD;
begin
  Wnd:= HookWnd;
  dwThreadID:= GetWindowThreadProcessId(HookWnd, nil);
  Dll_Hook:= SetWindowsHookEx(WH_CALLWNDPROC, @Dll_HookFunc, hInstance, dwThreadID);
  Result:= (Dll_Hook <> 0);
end;
daemon-rm вне форума Ответить с цитированием
Старый 17.12.2014, 14:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

длл в другом процессе это не длл вашего процесса, она грузится с нуля туда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.12.2014, 14:50   #3
daemon-rm
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
длл в другом процессе это не длл вашего процесса, она грузится с нуля туда.
Можно ли решить данную проблему? В C++ рекомендуют использовать Sharemem, если я не ошибаюсь. Как быть в Delphi?
daemon-rm вне форума Ответить с цитированием
Старый 17.12.2014, 15:09   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от daemon-rm Посмотреть сообщение
Можно ли решить данную проблему? В C++ рекомендуют использовать Sharemem, если я не ошибаюсь. Как быть в Delphi?
в Делфи это тоже возможно.

я бы использовал иные методы для передачи данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.12.2014, 15:19   #5
daemon-rm
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 25
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в Делфи это тоже возможно.

я бы использовал иные методы для передачи данных.
Название метода, пример метода?
daemon-rm вне форума Ответить с цитированием
Старый 17.12.2014, 16:17   #6
daemon-rm
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 25
По умолчанию

Разобрался.
Код:
const FileMappingName = 'NAME123';

type  TGlobalData = record
        HookWnd: THandle;
        //TargetWnd: THandle;
      end;
      PGlobalData = ^TGlobalData;

var Dll_Hook: HHOOK = 0;
    FileMappingHandle: THandle;
    GlobalData: PGlobalData = nil;

function Dll_HookFunc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall; 
  var CWP: TCWPStruct;     
begin
   if nCode=HC_ACTION then begin
     CWP:= PCWPStruct(lParam)^;
     if CWP.hwnd = GlobalData^.HookWnd then
       case CWP.message of
         WM_MOVE: begin
           
         end;
       end;
    end;
   Result:=CallNextHookEx(WH_CALLWNDPROC, nCode, wParam, lParam);
end;

function SetHook(HookWnd: HWND): Boolean;
  var dwThreadID: DWORD;
begin
  GlobalData^.HookWnd:= HookWnd;
  dwThreadID:= GetWindowThreadProcessId(HookWnd, nil);
  Dll_Hook:= SetWindowsHookEx(WH_CALLWNDPROC, @Dll_HookFunc, hInstance, dwThreadID);
  Result:= (Dll_Hook <> 0);
end;

procedure DLLHandler(Reason: Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH: begin
      FileMappingHandle:= CreateFileMapping($ffffffff, nil, PAGE_READWRITE, 0, SizeOf(TGlobalData), FileMappingName);
      GlobalData:= MapViewOfFile(FileMappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalData));
    end;
    DLL_PROCESS_DETACH: begin
      UnmapViewOfFile(GlobalData);
      CloseHandle(FileMappingHandle);
    end;
  end;
end;

begin
  DllProc:=@DLLHandler;
  DLLHandler(DLL_PROCESS_ATTACH);
end.
daemon-rm вне форума Ответить с цитированием
Старый 17.12.2014, 20:30   #7
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Код:
 var CWP: TCWPStruct;     
begin
   if nCode=HC_ACTION then begin
     CWP:= PCWPStruct(lParam)^;
-мелочь конечно, но, ведь происходит ненужное\напрасное копирования\дублирование структуры в переменную.
- лучше уж так: var CWP: PCWPStruct; CWP:= Pointer(lParam);....
xexxex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальная переменная winhttp C# (си шарп) 15 20.07.2016 16:03
Глобальная переменная = 0 в Worksheet_SelectionChange smbd Microsoft Office Excel 8 14.03.2011 15:03
Глобальная переменная mutabor JavaScript, Ajax 2 31.12.2010 12:23
C++ [Глобальная переменная] Lemo Помощь студентам 2 26.10.2009 17:49
Глобальная переменная в проектном файле. Nikolaeva Общие вопросы Delphi 8 23.04.2009 12:31