Показать сообщение отдельно
  #42  
Старый 08.11.2012, 17:21
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

icWasya , спасибо за пример но все не так, вы наверно не читали предыдущие сообщения и многое путаете.
Уточняю должно быть так и только так :
-В exe берется поинтер на процедуру perebor()
- отправляется в ловушку в dll
- в dll при срабатывании процедуры left() открывается процедура keyctrl уже в exe
- далее keyctrl запускает изначальную нужную perebor() присваивая адрес на нее.
Но тут то и облом... вот тоже самое в коде
----- EXE----
Код:
type
Tmain = class(TForm)
procedure perebor(Sender: TObject);// адрес этой процедуры передается в dll и обратно
end;
procedure RunStopHook(State : Boolean;pointperebor:pointer) stdcall; external 'hookkey.dll'; 
var
pointperebor: pointer;
......
implementation
procedure keyctrl(x:pointer)
var i:integer;
rezultat :procedure() ;
begin
@rezultat:=x;// адрес процедуры perebor()
rezultat();// вызов процедуры perebor
end;
.....
pointperebor:=@Tmain.perebor;
.....
begin
RunHook(true,pointperebor)// передаем в dll адрес на процедуру perebor
end;

......

------DLL------
Код:
procedure RunStopHook(State : Boolean;pointperebor:pointer) export; stdcall;
      begin
          if State=true then
          begin
          // Запускаем ловушку.
          SysHook := SetWindowsHookEx(WH_GETMESSAGE,
            @SysMsgProc, HInstance, 0);
          x:=pointperebor;
          left();
        end
        
      end;
procedure left(x:pointer);
    begin
    keyctrl(x);
    end;
Здесь и вопрос как сделать это
@rezultat:=x;// адрес процедуры perebor()
rezultat();// вызов процедуры perebor
если perebor присвоен к классу формы.
Ошибка "access violation at address" - я так полагаю он пытается запустить процедуру которой уже нет, обойти это никак нельзя? (Приэтом у меня подключен модуль fastsharemem)
Ответить с цитированием