Hi,
ich habe mir gerade eine
DLL geschrieben, die mir ein Interface implementieren soll.
Ein wenig Code dazu:
Delphi-Quellcode:
library CXClassLib;
uses
Windows,
CXClass,
CXInterfaces in '..\DelphiLib\Contrib\CXInterfaces.pas',
CXTypes in '..\DelphiLib\Contrib\CXTypes.pas';
{$R *.res}
type
TCXClasseDLL = class(TInterfacedObject, ICXClassDLL)
private
fClass: TCXClass;
public
constructor Create;
{...}
end;
constructor TCXClassDLL.Create;
begin
inherited;
// Instanz der Klasse erzeugen
fClass := TCXClass.Create;
end;
procedure TCXClassDLL.PrepareApplication({...})
begin
{...}
end;
{...}
function InitClass: ICXClassDLL; stdcall;
begin
Result := TCXClassDLL.Create;
end;
exports
InitClass;
begin
end.
Delphi-Quellcode:
type
ICXClassDLL = interface
['{2076EEAD-2CD2-4BD0-A87C-6F0341C18C5F}']
procedure PrepareApplication({...}); stdcall;
{...}
end;
Soweit so gut. Wenn ich nun aber in meiner Anwendung, die die
DLL verwenden soll folgendes mache:
Delphi-Quellcode:
function InitClass: ICXClassDLL; external 'CXClassLib.dll';
{...}
procedure TfrmMain.FormCreate(Sender: TObject);
begin
// Interface holen
fClassInt := InitClass;
// Vorbereiten
fClassInt.PrepareApplication({...});
end;
Bekomme ich direkt nach dem Aufruf der
DLL-Funktion eine AccessViolation. Über den Debugger weiß ich aber, dass er in die
DLL springt und dort auch die Instanz erzeugt wird. Jedoch gibt es keinen Aufruf an dem der Debugger die
Exception schmeißt, sondern einfach am Ende von
InitClass.
Im Aufrufstack erscheint als mehr oder weniger letzter Eintrag
ntdll.RtlConvertUlongToLargeInteger. Keine Ahnung, wo das her kommen soll.
Hat jemand eine Idee, wo das Problem liegt?
Chris