Главная страницаОбратная связьКарта сайта

Передача функции как параметра

В нашем случае лучшим решением будет использование процедурного типа. Допустим, что DllFunction() на входе хочет получить определенную функцию, поясним это на примере кода:


type
  TMyFuncType = function: integer;

var
  MyFunc: TMyFuncType;

function foo: integer;
begin
  result := 1;
end;

begin
  MyFunc := foo;
  DllFunction(longint(MyFunc));

Вы можете это сделать и так:


DllFunction( longint( @foo )) ;

Все же я не уверен в вопросах корректности использования таким образом в вызовах DLL. памяти (для меня пока неясна работа с памятью, находящейся в другом сегменте), как в этом примере, так что возможно для корректной работы вам придется объявить foo с директивой far, экспортировать ее в модуле, или что-то еще.

Также, в зависимости от того, как написана DllFunction(), вы можете в вызове подразумевать приведение типа:


function DllFunction( p: TMyFuncType ): Integer;
far; external "mydll";

В этом случае вам не нужна будет переменная MyFunc или оператор @.

В Delphi/Pascal вы можете передавать функции как параметры. Тем не менее, чтобы этим воспользоваться, необходимо для компилятора установить тип. Попробуйте следующий код (я реально его компилил и тестировал):


unit Unit1;

interface

uses

  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var

  Form1: TForm1;

implementation

{$R *.DFM}

type

  IntFunc = function: integer;

function DllFunction(iFunc: IntFunc): integer; far;
begin

  DllFunction := iFunc; {Обратите внимание на то, что это вызов функции}
end;

function iFoo: integer; far;
begin

  iFoo := 1;
end;

procedure TestIFunc;
var

  i: integer;
begin

  i := DllFunction(iFoo);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  TestIFunc;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin

  Close;
end;

end.

Вы можете сделать две вещи. Во-первых, если вы хотите использовать для передачи longint, напишите следующий код:


i := longint(@foo)

Другая вещь, которую вы можете сделать - исключить работу с longint и вызывать функцию dll следующим образом:


DLLfunction (@foo);

Имейте в виду, что если вы собираетесь вызывать foo из DLL, то необходимо предусмотреть вопросы совместимости, для получения дополнительной информации почитайте описание функции MakeProcInstance.


Обсудить статью на форуме


Если Вас заинтересовала или понравилась информация по разработке на Delph - "Передача функции как параметра", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2024 Дискета.info