Einzelnen Beitrag anzeigen

Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#1

Interfaces und Vererbung?

  Alt 21. Okt 2009, 23:42
Hallo Delphianer!
Ich hab mal einwenig mit Interfaces herumgespielt und aus Quellen hier im Forum eine kleine Schnittstellen-DLL zusammengebaut. Leider kriege ich eine Zugriffsverletzung und bin mir nicht im klaren darüber was der Grund dafür ist.

Folgender Code befindet sich in der DLL:
Delphi-Quellcode:
library IntfDll;

uses
  uBasic in 'uBasic.pas';

{$R *.res}

Type
  TBasic = Class(TInterfacedObject, IBasic)
  private
    fValue: Integer;
  public
    constructor Create; virtual;
    function Basic: Integer; stdcall;
  end;

  TBasic2 = Class(TBasic, IBasic2)
  private
    fValue2: Integer;
  public
    constructor Create; override;
    function Basic2: Integer; stdcall;
  end;



function GetIntf(Id: Integer): IBasic; stdcall;
begin
  Case Id Of
    0: Result := TBasic.Create;
    1: Result := TBasic2.Create;
    Else Result := NIL;
  End;
end;



constructor TBasic.Create;
begin
  inherited;
  fValue := 1;
end;

function TBasic.Basic: Integer;
begin
  Result := fValue;
end;




constructor TBasic2.Create;
begin
  inherited;
  fValue2 := 2;
end;

function TBasic2.Basic2: Integer;
begin
  Result := fValue + fValue2;
end;



exports
  GetIntf;
  
begin
end.
Dazu gibts eine kleine Schnittstellen-Unit die ich auch im Hauptprojekt verwende:

Delphi-Quellcode:
unit uBasic;

interface

Type
  IBasic = Interface
    ['{BF08333B-DBEE-4108-9466-6ECEE4AFD9A1}']
    function Basic: Integer; stdcall;
  end;

  IBasic2 = Interface(IBasic)
    ['{38E3D185-5337-4C5B-A3C8-FC7BBC82B855}']
    function Basic2: Integer; stdcall;
  end;


function GetIntf(Id: Integer): IBasic; stdcall;


implementation

function GetIntf(Id: Integer): IBasic; external 'IntfDll.dllname 'GetIntf';

end.
Und zum Abschluss das Testprogramm dazu:

Delphi-Quellcode:
program Tester;

{$APPTYPE CONSOLE}

uses
  SysUtils, windows,
  uBasic in 'uBasic.pas';

Var
  B: IBasic;
  B2: IBasic2;
begin
  WriteLn;
  B := GetIntf(0); //
  WriteLn('Basic.Basic = ',B.Basic);
  B := NIL;

  WriteLn;
  B2 := IBasic2(GetIntf(1));
  WriteLn('Basic2.Basic = ', B2.Basic);
  WriteLn('Basic2.Basic2 = ', B2.Basic2); //<-crash
  B2 := NIL;
end.

Ich will in der Art von TBasic noch weiter Klassen ableiten (mit zugehörigem Interface) aber auch von TBasic2 und GetIntf soll mir dann das Interface liefern... Das ganze sollte im übrigen auch von C# aus ansprechbar sein (muss ich da auf was besonderes achten?)...

Ich wäre für jeden Hinweis dankbar, bzw. mach ich ja was grundlegend falsch?

/edit: inherited zu TBasic.Create hinzugefügt

LG
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat