![]() |
Objekt in einer DLL kapseln
Hallo,
ich habe zurzeit folgendes Problem: Ich habe eine Unit, nennen wir sie mal Geraet_API In ihr habe ich eine Klasse zur Steuerung und Konfiguration eines Geraetes. Sieht dann ungefähr so aus:
Delphi-Quellcode:
Mein Problem ist nun, ich will diese Funktionen der API auslagern in eine DLL.
TGeraet.Set_GeraeteReset; // Setzt das Gerät zurück
TGeraet.Set_Seriennummer(SN:String); // speichert die Seriennummer im Gerät ab ... Wie kann ich denn in meiner DLL ein Objekt erzeugen um den Zugriff der DLL zu ermöglichen? Danke euch! |
Re: Objekt in einer DLL kapseln
Ein Objekt in einer DLL zu instantiieren ist problemlos. Man muss es halt nur explizit machen.
Probleme treten erst auf wenn man das Objekt an das Hauptprogramm gibt. DLL und Hauptprogramm haben separate Memorypools. Die Einbindung von ShareMem beseitigt diese Probleme. Eine DLL die direkt eine Klasse implementiert ist nur in C++ moeglich und verstoesst gegen Sinn und Zweck einer DLL. Die Klassenimplementation ist naemlich Compilerspezifisch. |
Re: Objekt in einer DLL kapseln
Hallo,
eigentlich will ich gar nicht ein Objekt übergeben, will es nur für meine Exportierung der Funktionen nutzten. D.h. ich will ja nicht meine ganzen Methoden in Klassen umschreiben müssen. Wie mache ich das denn am Besten? |
Re: Objekt in einer DLL kapseln
Klassen und DLLs sind nicht wirklich eine sinnvolle und glückliche Kombination und sollte möglichst vermieden werden. Gründe findest du hier im Forum. Für Delphi böten sich noch Packages an, welches eigentlich nur Delphi spezifische DLLs sind.
|
Re: Objekt in einer DLL kapseln
Hallo Luckie,
ja bpls kann ich leider nicht nutzen, da ich die DLL von Visual Basic-Programmierern (aaah) genutzt werden soll :shock: Mmh, heißt das im Umkehrschluss ich muss meine Unit so umschreiben, dass ich nur Funktionen ohne Klassenimplemenation habe? Gruß DelphiManiac |
Re: Objekt in einer DLL kapseln
Ein zur DLL internes Objekt ist wirklich problemlos. Wenn das DLL API sauber sprachunabhaengig ist (also keine Delphi Strings usw), dann instantiiere einfach das Objekt.
|
Re: Objekt in einer DLL kapseln
Verpacke deine Klasse in ein Interface und sorge dafür, dass die Verwendung aller Eigenschaften und Parameter unabhängig vom Memorymanager sind.
Zum Beispiel WideString statt AnsiString. Nun brauchst du nur noch eine exportierte Funktion, die dir die Interface-Referenz zurückgibt. Nachtrag: Zitat:
Wenn nicht: Was du hier machen müsstest wäre eine ActiveX-Library. Die Stubs für deine COM-Klasse lässt sich dann im TypeLib-Editor anlegen, er generiert für dich dann auch das COM-Interface und ein Dispatch-interface. Ob du dir wirklich VB-*piep*s als Benutzer deiner Lib aufhalsen willst ist deine Entscheidung, und das dürfte auch schon der schwierigste Teil des Ganzen sein. ;) |
Re: Objekt in einer DLL kapseln
@Robert Marquardt
Wo genau soll ich denn das Objekt erzeugen
Delphi-Quellcode:
library DLL;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } uses SysUtils, Classes; exports // kann ich dann sowas machen?? Obj.Set_Seriennummer;//???? begin // HIER???? Obj:=TGeraet.Create;//?? end |
Re: Objekt in einer DLL kapseln
Dass mit den VB'lern kann ich mir leider nicht aussuchen ... :stupid:
|
Re: Objekt in einer DLL kapseln
Exportieren kann man nur einfache Funktionen. Du musst also ein Funktions-API stricken. Das sollte einfach sein, da du ja nur genau ein Objekt in einer globalen Variablen hast.
Delphi-Quellcode:
library DLL;
uses SysUtils, Classes; var Geraet: TGeraet; function Seriennummer: Cardinal; begin Result := Geraet.Seriennummer; end; // wie man das Objekt beim Entladen der DLL brav freigibt procedure LibExit(Reason: Integer); begin if Reason = DLL_PROCESS_DETACH then FreeAndNil(Geraet); end; exports Seriennummer; begin DLLProc := LibExit; Geraet := TGeraet.Create; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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