Показать сообщение отдельно
  #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;
Ответить с цитированием