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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2010, 17:35   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Не удаётся изменить переменную в ДЛЛ. Пошагово, она меняется. А при выходе из функции обратно

Ниже выложил код ДЛЛ. Хук ставиться при помощи SetKeyHook. Если посмотреть за SetKeyHook, то там хук ставиться и Active загоняется в True, но когда дело доходит до function KeyHook, то там Active уже false... Не понимаю, что не так...

Код:
library hookDLL;

uses
  Windows,
  Messages,
  dialogs,
  sysutils;

var
  HookHandle: HHOOK = 0;
  Active: boolean = false;

function KeyHook(CODE, WParam, LParam: DWORD): DWORD; stdcall;
begin
  //ShowMessage('a');
  if CODE=HC_ACTION then
  begin
    beep;
    //ShowMessage(BoolToStr(Active, true));
    if Active then
    begin
      beep;
      //ShowMessage(IntToStr(WParam));
      if (WParam=18) or (WParam=ord('Q')) or (WParam=ord('W')) or
        (WParam=ord('E')) or (WParam=ord('R')) then
      //if (WParam=18) then
      begin
        Result:=100;
        exit;
      end;
    end;
  end;                            //jhgokkljkjy
  Result:=CallNextHookEx(HookHandle, code, WParam, LParam);
  //ShowMessage(IntToStr(WParam));
end;

procedure SetKeyHook(war3: HWND); stdcall; export;
var
  pid: Cardinal;
begin
  pid:=GetWindowThreadProcessId(war3);
  //Active:=true;
  if HookHandle=0 then
   HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, pid);
  if HookHandle<>0 then
    Active:=true;
end;

procedure DelKeyHook; stdcall; export;
begin
  if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle);
   HookHandle:=0;
  Active:=false;
end;

function IsActive:boolean; stdcall; export;
begin
  Result:=Active;
end;

procedure SetActive(__active: boolean); stdcall; export;
begin
  Active:=__active;
end;

exports
  SetKeyHook, DelKeyHook, IsActive, SetActive;

begin
end.
TwiX вне форума Ответить с цитированием
Старый 22.05.2010, 18:13   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Вот что заметил: Active всегда true, но почему-то функция KeyHook думает, что он false. Заметил это так: в функции isActive дописал if Active then beep, а в таймере основной форме начал вызывать isActive. Всегда происходили бипы...
TwiX вне форума Ответить с цитированием
Старый 22.05.2010, 19:54   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
var
  HookHandle: HHOOK = 0;
  Active: boolean = false;
Так к слову, вы в курсе, что глобальные переменные в .dll (если она используется как Hooks) использовать нельзя ?

Объясняю, во избежание матюков , ваша .dll загружается во все процессы (в их адресное пространство), таким образом когда вы вызываете IsActive или SetActive, вы меняете переменную только в вашем процессе, во всех других она остается прежней.

Решение: смотрим и читаем статьи, как правильно создавать глобальные хуки и расшаривание памяти между приложениями
BOBAH13 вне форума Ответить с цитированием
Старый 22.05.2010, 20:03   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

BOBAH13, в принципе я ему обьяснил, но пусть для поиска будет
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.05.2010, 20:34   #5
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

BOBAH13, спасибо) Пепел фенкиса мне сказал примерно тоже самое)
Сделал без Active, немного изменил код главного приложения. Наконец-то я доделал эту прогу=)

А можно ссылку на расшаривание памяти в глобалных хуках? Гугл ничего не показал...
TwiX вне форума Ответить с цитированием
Старый 23.05.2010, 11:10   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
А можно ссылку на расшаривание памяти в глобалных хуках? Гугл ничего не показал...
CreateFileMapping к примеру

p.s. не ну я же не видел что Вы ему объяснили
BOBAH13 вне форума Ответить с цитированием
Старый 23.05.2010, 11:48   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
не ну я же не видел что Вы ему объяснили
я думаю даже лучше это, останется потомкам
если они искать будут...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java скрипт, при наведении на карту она остается картой но картинка меняется Dimazess Помощь студентам 6 14.03.2010 16:46
Ошибка при выходе из игры cs 1.6 pavel42 Компьютерное железо 19 20.10.2009 21:00
Скрипт срабатывающий при выходе со странички. valyan-t JavaScript, Ajax 0 30.09.2009 17:40
Как передать параметры функции в ДЛЛ????? Zerone Общие вопросы Delphi 3 01.06.2009 09:27
Ошибка при выходе из ждущего режима. С.М.С Компьютерное железо 2 08.03.2009 02:38