Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Interface Implementierung (https://www.delphipraxis.net/81251-interface-implementierung.html)

conti 23. Nov 2006 13:03


Interface Implementierung
 
Es gibt eine x_tlb.pas Datei mit Intefaces und eine andere Datei y_tlb.pas die eine Interface aus der x_tlb Datei implementiert.
Ich möchte nun eine andere Interface aus der x_tlb Datei verwenden ... weiss aber nicht wie.

Könnte jemand helfen ?

mkinzler 23. Nov 2006 13:18

Re: Interface Implementierung
 
Was meinst du mit datein mit Interfaces? Du meinst wohl das in der datei ein Interface deklariert wurde.
Ein anderes Interface implemnetierst du genauso.

markusl 23. Nov 2006 13:25

Re: Interface Implementierung
 
Je nachdem um was für eine Art von Interface es sich
handelt kann es so oder so ähnlich aussehen:

Delphi-Quellcode:
uses
  X_TLB, ComObj, ActiveX;

  ...
  TImplementingClass = class(TAutoObject, IMyInterface)
  ...



// im Init-Abschnitt der Unit, die die implementierende Klasse enthält

initialization
  TAutoObjectFactory.Create(ComServer, TImplementingClass, CLASS_MyInterface,
    ciMultiInstance, tmApartment);
Gruss,
Markus

shmia 23. Nov 2006 14:04

Re: Interface Implementierung
 
Im Typelib-Editor von Delphi kannst du andere TLBs includieren.
Dazu links die Wurzel (Symbol 3 Rauten) anklicken und rechts auf Reiter "Verwendet" klicken.
Dann im Kontextmenu "Alle Typbiblitheken anzeigen" wählen.

conti 23. Nov 2006 14:08

Re: Interface Implementierung
 
Ja, aber die Implementation der ersten Interface ... war schon "vorhanden".

Die vorhandene Klasse die eine Interface implementiert sieht so aus:
Delphi-Quellcode:
  TSB_API = class(TOleServer) // hier TOleServer!
  private
...
    FIntf:       ISB_API;
    function     GetDefaultInterface: ISB_API;
 protected
    procedure InitServerData; override;
    procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Connect; override;
    procedure ConnectTo(svrIntf: ISB_API);
    procedure Disconnect; override;
    procedure Init(const p_bstrIN: WideString; out p_pbstrOUT: WideString; out p_plRetVal: Integer);
 ...
end;

...

procedure Register;

resourcestring
  dtlServerPage = '(none)';

  dtlOcxPage = '(none)';

implementation

uses ComObj;

class function CoSB_API.Create: ISB_API;
begin
  Result := CreateComObject(CLASS_SB_API) as ISB_API;
end;

class function CoSB_API.CreateRemote(const MachineName: string): ISB_API;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_SB_API) as ISB_API;
end;

...

procedure TSB_API.Connect;
var
  punk: IUnknown;
begin
  if FIntf = nil then
  begin
    punk := GetServer;
    ConnectEvents(punk);
    Fintf:= punk as ISB_API;
  end;
end;

function TSB_API.GetDefaultInterface: ISB_API;
begin
  if FIntf = nil then
    Connect;
  Assert(FIntf <> nil, 'DefaultInterface ist NULL. Die Komponente ist nicht mit dem Server verbunden. Sie müssen vor dieser Operation ''Connect'' oder ''ConnectTo'' aufrufen');
  Result := FIntf;
end;

procedure TSB_API.Init(const p_bstrIN: WideString; out p_pbstrOUT: WideString;
                       out p_plRetVal: Integer);
begin
  DefaultInterface.Init(p_bstrIN, p_pbstrOUT, p_plRetVal); //hier klappt es!
end;
...


Meine Klasse für die neue Interface sieht so aus (habe ein COM Object erstellt):
Delphi-Quellcode:
type
  TSB_SIS = class(TAutoObject, ISB_SIS) // hier TAutoObject!
  private
   isb: ISB_SIS;
  protected
  public
    constructor Create;
    destructor Destroy; override;
    procedure Advise4SIS(const p_bstrIN: WideString; out p_pbstrOUT: WideString;
      out p_plRetVal: Integer); safecall;
...
end;

...

implementation

uses ComServ;

constructor TSB_SIS.Create;
begin
   isb := CoISB_SIS.Create;
end;

destructor TSB_SIS.Destroy;
begin
  inherited;
end;

procedure TSB_SIS.Advise4SIS(const p_bstrIN: WideString;
  out p_pbstrOUT: WideString; out p_plRetVal: Integer);
begin
   isb.Advise(p_bstrIN, p_pbstrOUT, RetVal); //hier klappt es nicht!
end;
 ...
... es klappt leider nicht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz