Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #46  
Старый 09.11.2012, 00:05
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Поправил аргумент и сделал вот так
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  
Старый 09.11.2012, 05:32
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Ну чтож похоже круг замкнул нужная процедура которая является классом формы вызывается через DLL при помощи передачи адреса на нее.
Возникает последний вопрос если я захочу вызвать другие функции также присвоенные классу формы, мне их также вызывать перетаскивая через dll адрес,
Интересно где ты набрался такой терминологии?
Процедура никогда и ни при каких обстоятельствах не может являться никаким классом (в том числе и формы).
И пожалуйста прекрати использовать термин "функция присвоенная классу". Этим ты и других путаешь и себя вводишь в заблуждение. Функция (или процедура) объявленная внутри класса называется методом. Обычные процедуры/функции и методы это разные вещи (хоть и похожие) и работа с ними отличается. Чтобы вызвать метод объекта нужно в обязательном порядке указывать так же и объект с которым должен работать этот метод. Для обычных же процедур/функций никаких объектов указывать не нужно.
И что означает "вызывать перетаскивая через dll адрес"?
Цитата:
Сообщение от helgboy
или можно прямо из

procedure Tmain.perebor(Sender:Tobject);
begin
perebor2();
perebor3();
Tmain.heigth:=200;// или вот такое вызвать
Tmain - это у тебя класс. Тебе известна разница между классом и объектом?
Цитата:
Сообщение от helgboy
Оговорюсь что уже попытался, компиляция проходит, но при выполнении программа вылетает с ошибкой обращения к адресу
Только не говори, что этот модуль (из exe-шника) ты опять "прикомпилировал" к своей dll-ке.
Ответить с цитированием
  #48  
Старый 09.11.2012, 10:09
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Я извиняюсь за свою терминологию, это минусы самообучения... Постараюсь больше не путать всех. Я имел ввиду если я успешно вызвал через dll один метод из exe то смогу я уже внутри него(вызванного метода) вызывать другие методы, а также простые процедуры из exe . Меня уже самого достал этот вопрос, и хочется поскорее с ним закончить если нет, то есть ли вариант считывать нажатия клавиш без dll, если и так ельзя то я откажусь от своей идеи...
Ответить с цитированием
  #49  
Старый 09.11.2012, 10:37
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Я имел ввиду если я успешно вызвал через dll один метод из exe то смогу я уже внутри него(вызванного метода) вызывать другие методы, а также простые процедуры из exe .
Конечно можешь. Вопрос только как ты "вызвал через dll один метод из exe"?
Метод объекта можно вызвать только у объекта.
Ответить с цитированием
  #50  
Старый 09.11.2012, 12:30
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Если в 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  
Старый 09.11.2012, 17:15
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
Хорошо

Да, ураааа работает.Теперь все методы успешно вызываются и правильно работают, наконец-то
надо было действительно все методы формы описывать так,указывая сам объект:
Код:
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  
Старый 09.11.2012, 21:34
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А теперь ещё раз - что именно написано в DLL и что в EXE ?
Ответить с цитированием
  #53  
Старый 09.11.2012, 22:31
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

******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;

******DLL****
Код:
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  
Старый 10.11.2012, 02:22
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

А
Цитата:
pointval
и
Цитата:
pointcameraval
это типа одно и то же? Откуда это pointcameraval берется? Я здесь не вижу.
Ответить с цитированием
  #55  
Старый 10.11.2012, 23:23
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

извиняюсь было поздно - поправил
Ответить с цитированием
  #56  
Старый 11.11.2012, 00:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
******EXE******
Код:
.....
procedure keyctrl( nx: pointer);
var i:integer;
proc: procedure() of object;
begin
@proc:=nx;
proc;
showmessage(' работает keyctrl N='+IntToStr(N));  // почему N оказывается равен 0  ?
end;
.....
******DLL****
Код:
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.
  1. Директива export является устаревшей и использовать её не нужно.
  2. Нет смысла сравнивать булевую переменную с true. Т.е. вместо "if State=true then" пиши просто "if State then"
  3. Откуда в DLL взялась keyctrl если она у тебя описана в EXE?
Ответить с цитированием
  #57  
Старый 11.11.2012, 01:15
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Она там не взялась я из DLL ее вызываю в определенный момент, какой именно я естественно , вырезал.. это сейчас лишнее важно то что вызываю из DLL
Ответить с цитированием
  #58  
Старый 11.11.2012, 01:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Она там не взялась я из DLL ее вызываю в определенный момент, какой именно я естественно , вырезал.. это сейчас лишнее важно то что вызываю из DLL
Наоборот - это важный момент, потому что ответ на вопрос как ты вызываешь в DLL функцию keyctrl описанную в EXE, даст тебе ответ на вопрос "почему N оказывается равен 0".
Я так понимаю тебя ответ на этот вопрос интересует? Если так, то повторю вопрос: Как ты вызываешь из DLL keyctrl если она у тебя описана в EXE?
Ответить с цитированием
  #59  
Старый 12.11.2012, 14:28
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Код:
  
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  
Старый 12.11.2012, 14:34
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Код:
.....
procedure left();
    begin
    keyctrl(nx1);
    end;
.....
А откуда в DLL взялась процедура keyctrl если она у табя описана в EXE?
Ты указатель на эту процедуру передаёшь из EXE в DLL? Или как ты из DLL получаешь к этой процедуре доступ?
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter