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.dll'
name '
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