|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#46
|
|||
|
|||
Поправил аргумент и сделал вот так
pointproc:=perebor; (без Tmain);И все заработало функция perebor вызвалась через злощастную DLL... Ну чтож похоже круг замкнул нужная процедура которая является классом формы вызывается через DLL при помощи передачи адреса на нее. Возникает последний вопрос если я захочу вызвать другие функции также присвоенные классу формы, мне их также вызывать перетаскивая через dll адрес, или можно прямо из procedure Tmain.perebor(Sender:Tobject); begin perebor2(); perebor3(); Tmain.heigth:=200;// или вот такое вызвать .... end; Оговорюсь что уже попытался, компиляция проходит, но при выполнении программа вылетает с ошибкой обращения к адресу Последний раз редактировалось helgboy, 09.11.2012 в 00:50. |
#47
|
||||
|
||||
Цитата:
Процедура никогда и ни при каких обстоятельствах не может являться никаким классом (в том числе и формы). И пожалуйста прекрати использовать термин "функция присвоенная классу". Этим ты и других путаешь и себя вводишь в заблуждение. Функция (или процедура) объявленная внутри класса называется методом. Обычные процедуры/функции и методы это разные вещи (хоть и похожие) и работа с ними отличается. Чтобы вызвать метод объекта нужно в обязательном порядке указывать так же и объект с которым должен работать этот метод. Для обычных же процедур/функций никаких объектов указывать не нужно. И что означает "вызывать перетаскивая через dll адрес"? Цитата:
Цитата:
|
#48
|
|||
|
|||
Я извиняюсь за свою терминологию, это минусы самообучения... Постараюсь больше не путать всех. Я имел ввиду если я успешно вызвал через dll один метод из exe то смогу я уже внутри него(вызванного метода) вызывать другие методы, а также простые процедуры из exe . Меня уже самого достал этот вопрос, и хочется поскорее с ним закончить если нет, то есть ли вариант считывать нажатия клавиш без dll, если и так ельзя то я откажусь от своей идеи...
|
#49
|
||||
|
||||
Цитата:
Метод объекта можно вызвать только у объекта. |
#50
|
|||
|
|||
Если в DLL вызываешь процедуру с такой сигнатурой
Код:
type TProc = Procedure(); Когда в DLL передаёшь указатель на вот это Код:
procedure Tmain.perebor(Sender:Tobject); функция ожидает два параметра TForm и Sender, а в регистрах EAX и EDX. А там мусор. .... Если в DLL хочешь передавать только один указатель, тогда в EXE нужно написать Код:
type Tvideodriver = class(TForm) procedure perebor(Sender: TObject); procedure Button1Click(Sender:TObject); end; var videodriver:Tvideodriver; type TProc = Procedure(); procedure RunStopHook(State : Boolean;pointperebor:TProc);// лучше сразу указывать правильный тип stdcall; external 'hookkey.dll'; implementation procedure perebor();// свободная процедура begin videodriver.Perebor(Nil); // используется глобальная переменная videodriver:Tvideodriver; end; procedure Tvideodriver.Button1Click(Sender:TObject); begin RunStopHook(true,perebor); //<<== заметь, без @ и без скобок end; |
#51
|
|||
|
|||
Да, ураааа работает.Теперь все методы успешно вызываются и правильно работают, наконец-то
надо было действительно все методы формы описывать так,указывая сам объект: Код:
var N:integer; ..... implementation procedure keyctrl( nx: pointer); var i:integer; proc: procedure() of object; begin @proc:=nx; proc; videodriver.perebor2(); /// надо было так!! showmessage(' работает keyctrl N='+IntToStr(N)); // почему N оказывается равен 0 ? end; procedure Tvideodriver.perebor2(); begin N:=3; end; А почему переменная N=0 ???? Последний раз редактировалось helgboy, 09.11.2012 в 17:22. |
#52
|
|||
|
|||
А теперь ещё раз - что именно написано в DLL и что в EXE ?
|
#53
|
|||
|
|||
******EXE******
Код:
type Tvideodriver = class(TForm) procedure perebor(); end; procedure keyctrl(nx:pointer); var N:integer; pointval: pointer; temp: procedure() of object; ..... implementation procedure keyctrl( nx: pointer); var i:integer; proc: procedure() of object; begin @proc:=nx; proc; showmessage(' работает keyctrl N='+IntToStr(N)); // почему N оказывается равен 0 ? end; procedure Tvideodriver.perebor(); begin N:=3; end; procedure Tvideodriver.openClick(Sender: TObject); begin RunStopHook(true,pointval); end; procedure Tvideodriver.FormCreate(Sender: TObject); begin temp:=videodriver.perebor; pointval:=@temp; end; Код:
uses ...... var nx1:pointer; procedure RunStopHook(State : Boolean;pointval:pointer) export; stdcall; begin if State=true then begin // Запускаем ловушку. SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0); nx1:=pointval; keyctrl(nx1); end end; exports RunStopHook; begin end. Последний раз редактировалось helgboy, 10.11.2012 в 23:22. |
#54
|
||||
|
||||
А
Цитата:
Цитата:
|
#55
|
|||
|
|||
извиняюсь было поздно - поправил
|
#56
|
||||
|
||||
Цитата:
|
#57
|
|||
|
|||
Она там не взялась я из DLL ее вызываю в определенный момент, какой именно я естественно , вырезал.. это сейчас лишнее важно то что вызываю из DLL
|
#58
|
||||
|
||||
Цитата:
Я так понимаю тебя ответ на этот вопрос интересует? Если так, то повторю вопрос: Как ты вызываешь из DLL keyctrl если она у тебя описана в EXE? |
#59
|
|||
|
|||
Код:
var SysHook : HHook = 0; Wnd : Hwnd = 0; nx1:pointer; function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(SysHook, Code, wParam, lParam); if code = HC_ACTION then begin Wnd := TMsg(Pointer(lParam)^).hwnd; if TMsg(Pointer(lParam)^).message =WM_KEYDOWN then //Работает case (TMsg(Pointer(lParam)^).wParam) of 37: begin left() end; end; end; end; procedure left(); begin keyctrl(nx1); end; // Процедура запуска. procedure RunStopHook(State : Boolean;pointval:pointer) export; stdcall; begin if State=true then begin // Запускаем ловушку. SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0); nx1:=pointval; end else begin // Отключить ловушку. UnhookWindowsHookEx(SysHook); SysHook := 0; end; end; exports RunStopHook; |
#60
|
||||
|
||||
Цитата:
Ты указатель на эту процедуру передаёшь из EXE в DLL? Или как ты из DLL получаешь к этой процедуре доступ? |