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)