Файл delphi tlb_lib из компонента com не имеет связи между интерфейсом и объектом - PullRequest
0 голосов
/ 04 марта 2012

После импорта в delphi файл com dll, в свою очередь, delphi сгенерировал файл lib_tlb.pas.

Проверка файла, который он показывает

Iinterface1 = interface(IDispatch)
    function func: Integer; safecall;
    procedure proc(param:Iinterface1);
end;

Cointerface1 = class
  class function Create: Iinterface;
  class function CreateRemote(const MachineName: string): Iinterface1;
end;

Tinterface1 = class(TOleServer)
    function func: Integer;
    procedure proc(param:Iinterface1);
end;

Теперь ясно, чтонет связи между Tinterface1 и Iinterface1.

Проблема возникает, когда вызывается proc с Tinterface1.это не скомпилирует Tinterface1 не наследует Iinterface1.

Итак, что предлагается сделать?изменить библиотеку, которая генерируется автоматически?или у вас есть лучшее представление о том, что делать, когда вы хотите передать Tinterface1 в proc.

Пример - это упрощение кода, в коде есть другой объект, который должен быть тем, который должен быть переданоднако proc знает, что proc знает только свой интерфейс, что является той же проблемой.

update: как кажется, руководство к файлу com dll говорит, что proc должен быть

    procedure proc(param:^Tinterface1);

где интерфейс только с точки зрения delphi.

1 Ответ

3 голосов
/ 04 марта 2012

TInterface1.Proc() ожидает, что ранее существующий объект IInterface1 будет передан ему в качестве ввода. Используйте Cointerface1.Create() для создания этого объекта, например:

var
  intf: Iinterface1;
begin
  intf := Cointerface1.Create;
  TheOleServerInstance.proc(intf);
end;

Tinterface1 является потомком TOleServer, который не наследуется напрямую от Iinterface1 (но он внутри Iinterface1 оборачивает), поэтому вы должны приводить его в любое время, когда хотите передать его туда, где Iinterface1 ожидается, например:

var
  intf: Iinterface1;
  svr: Iinterface1;
begin
  intf := Cointerface1.Create;
  if Supports(TheOleServerInstance, Iinterface1, svr) then
    intf.proc(svr);
end;
...