![]() |
Interfaces + Dlls + Typ Überprüfen
Ich hab grad ein sehr seltsames Problem wobei die Typ Überprüfung "if (var) is (class) then" nicht funktioniert bzw. immer False zurückgibt.
Situation ist eine Dll und eine Hostanwendung die über Interfaces miteinander kommunizieren (VCL und RTL als runtime packages sind auch im spiel, sollte aber hier kein Problem sein da das Problem mit komplett eigenen, VCL und third party klassen auftritt). Die Dll bekommt von der Host anwendung ein Interface übergeben mit dem sie Daten an die Host Anwendung schicken kann (und mit der die Host Anwendung dann arbeitet). Übergeben werden Klasse als parameter. Problem ist das die Hostanwendung den Typ der Klasse nicht identifizieren kann. Aber am besten ein Beispiel... (ungetesteter Beispiel Code der nur das Problem verdeutlichen soll) Interface
Delphi-Quellcode:
In der Dll:
type
IHostInterface = interface [GUID] procedure DoSomethingElse(Param : TObject); stdcall; end;
Delphi-Quellcode:
Anwendung die Interface implementiert und in der Problem auftritt
var
MyClass : TMyClass; [...] function DoSomething(HostInterface : IHostInterface); begin HostInterface.DoSomethingElse(MyClass); end; Exports DoSomething; begin MyClass := TMyClass.Create; end.
Delphi-Quellcode:
Problem ist das in der Anwendung die Überprüfung "if Param is TMyClass then" nicht funktioniert und immer False zurück gibt. Lustigerweise geht die entsprechende Typumwandlung problemlos.
procedure THostInterface.DoSomethingElse(Param : TObject);
begin if Param is TMyClass then [...] // gibt immer False zurück! TMyClass(Param).SomeClassFuntion(); // geht problemlos... end; Das ganze ist mir jetzt schon an mehreren Stellen mit verschiedenen Klassen aufgetreten. (Graphics32, eigene auf TComponent basierende Komponenten, etc.). Was ich verwirrend finde ist das das Type Casting problem funktioniert und die Klasse danach wie vorgesehen verwendet werden kann, nur die Überprüfung ob der TObject/TComponent parameter denn diese Klasse ist funktioniert nicht (und leider ist das manchmal notwendig). |
Re: Interfaces + Dlls + Typ Überprüfen
Hallo,
Dein Problem ist folgendes: Die DLL und Dein Hauptprogramm benutzen (wenn Du nicht mit Runtime-Packages arbeitest) jeweils ihre eigene RTL. Nun sind zwar ein TObject aus der Hauptanwendung und ein TObject aus der DLL intern identisch, aber sie werden von zwei unterschiedlichen RTLs verwaltet. Deshalb funktionieren die Operatoren is und as nicht. Eine Lösung wäre, auch das Object, das Du als Parameter übergibst, in ein Interface zu packen. Das kannst Du dann überprüfen. Diese Lösung hat aber den Nachteil, dass Du dann entweder die Referenzzählung aushebeln oder das Objekt grundsätzlich immer als Interface ansprechen musst. Gruß xaromz |
Re: Interfaces + Dlls + Typ Überprüfen
Danke, sowas in der Art hab ich schon befürchtet. Das ganze in interfaces kapseln kommt leider nicht in Frage da das gerade bei third party Komponenten wie TBitmap32 in zu viel arbeit ausartet. Dann bleibt wohl nix weiter als einen weiteren Parameter einzuführen der den Typ angibt und dann direktes Type Casting basierend auf dem Parameter zu machen.
Delphi-Quellcode:
nicht schön... aber sollte gehen
type
TClassType = [ctMyClass,ctMyOtherClass]; procedure THostInterface.DoSomethingElse(Param : TObject; ClassType : TClassType); begin if ClassType is ctMyClass then TMyClass(Param).SomeClassFuntion(); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 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