Требуемая переменная ошибка (Delphi) - Как получить адрес процедуры? - PullRequest
2 голосов
/ 26 июня 2019

Использование Delphi 7 здесь. Когда я беру адрес процедуры (с целью отправки адреса этого метода во внешнюю DLL C ++ в качестве обратного вызова), компилятор Delphi 7 сообщает Variable required. Зачем? Как вы берете адрес метода с или без списка параметров?

Вот мой упрощенный код, который показывает ошибку компилятора.

// ...

type
  PTProcedureCallback = ^TProcedureCallback;
  TProcedureCallback = procedure() of object;

  // ...

  TTestCallback = class
    constructor Create();
    procedure MyCallback();
  end;

    //...

implementation
  constructor TTestCallback.Create();
  var
    pCallback: PTProcedureCallback;
  begin
    // Constructor
    inherited;

    // Test callback
    pCallback := @MyCallback;   // <- [Error] Variable required
  end;

  procedure TTestCallback.MyCallback();
  begin
    // Do something
  end;
end;

1 Ответ

3 голосов
/ 26 июня 2019

Вам вообще не нужно PTProcedureCallback, так как TProcedureCallback уже является типом указателя.

constructor TTestCallback.Create();
var
  pCallback: TProcedureCallback;
begin
  // Constructor
  inherited;
  // Test callback
  pCallback := MyCallback;
end;

Тем не менее, вы не можете использовать procedure of object в качестве обратного вызова C / C ++, если только код C / C ++ не был написан специально для C ++ Builder и фактически не ожидает procedure of object через * 1008. * расширение компилятора. Если нет, вы не сможете использовать нестатический метод класса в качестве обратного вызова. Однако, если обратный вызов позволяет вам передать определенное пользователем значение, вы можете использовать его для передачи указателя Self вашего объекта, чтобы ваш обратный вызов мог получить доступ к его нестатическим членам.

Кроме того, ваш TProcedureCallback использует стандартное соглашение о вызовах Delphi register (__fastcall в C ++ Builder), которого нет в компиляторах, отличных от C ++ Builder. Только cdecl и stdcall являются соглашениями о переносимых вызовах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...