VCL Komponenten in einer DLL



  • hallo zusammen

    ich versuche in einer DLL VCL komponenten zu benutzen. leider meldet mir das host porgramm die exception EClassNotFound. ich habe gelesen das man die komponenten registrieren soll. das habe ich wie folgt versucht:

    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    	TComponentClass classes[7] = {__classid(TAdvListView),
    								  __classid(TZipBuilder),
    								  __classid(TIdFTP),
    								  __classid(TIdHTTP));
    
    	RegisterClasses(classes, 2);
    	return 1;
    }
    

    leider ohne erfolg. ich möchte eine komplette klasse aus der DLL exportieren, damit ich diese um host programm verwenden kann. das sieht im header der DLL wie folgt aus:

    class __declspec(dllexport) Manager
    {
    	public:
    		Manager();
    		~Manager();
    
    	private:
    		TZipBuilder *ZIP;
    		TIdFTP *FTP;
    		TIdHTTP *HTTP;
    };
    

    und hier noch der konstruktor/destruktor:

    Manager::Manager()
    {
    	ZIP = new TZipBuilder(Application);
    	FTP = new TIdFTP(Application);
    	HTTP = new TIdHTTP(Application);
    }
    //---------------------------------------------------------------------------
    Manager::~Manager()
    {
    	delete ZIP;
    	delete FTP;
    	delete HTTP;
    
    	ZIP = NULL;
    	FTP = NULL;
    	HTTP = NULL;
    }
    

    wie genau verwendet man nun VCL komponenten korrekt in einer DLL, damit es auch funktioniert? vielen dank für eure hilfe



  • huch, das sollte natürlich wie folgt lauten:

    TComponentClass classes[3] = {__classid(TZipBuilder),
    								  __classid(TIdFTP),
    								  __classid(TIdHTTP));
    


  • laos das problem ist damit nicht behoben 🙂 😞



  • Das hier

    http://bcb-tutorial.c-plusplus.net/inhalt.html
    (Verwendung der VCL in DLLs)

    schon durch geackert?



  • das hilft mir leider nicht weiter. ich sehe dort nichts davon, wie man VCL komponente in einer DLL richtig anwendet. lediglich, wie man ein formular anzeigt (welches dann ihre eigenen komponenten unter __published verwaltet), jedoch nicht wie man komponenten korrekt deklariert, definiert, registriert und wieder freigibt.

    mich interessiert hald eben am ehesten, wie man komponenten nun richtig einsetzt, damit die DLL und die host anwendung korrekt laufen, bzw. überhaupt laufen.



  • Hallo

    Der Fehler stammt nicht vom Einbinden der DLL oder dem Benutzen der Klassen mit new. Dieser Teil ist soweit korrekt, sonst würde auch der Compiler/Linker meckern und nicht erst eine Exception zur Laufzeit.
    Sondern von einer VCL-Funktion, vermutlich RegisterClasses. Wozu brauchst du das überhaupt? Laut BCB-Hilfe ist das zuständig für die Verwendung in speziellen VCL-Streams. Da du aber offenbar die Klassen rein dynamisch verwendest, brauchst du das nicht. Kommentier mal die beiden ersten Zeilen in DLLEntryPoint aus und teste ob es nun fehlerfrei läuft.

    bis bald
    akari



  • das funktioniert leider auch nicht. hatte es am anfang so. kann es konflikte geben, wenn ich in der DLL komponenten gelinkt habe, die auch in der host anwendung vorkommen? also z.B. in der DLL und in der EXE:

    #pragma link "ZipBuilder"
    

    eigentlich nicht oder? wie soll ich dem linker sonst bekant geben, das die external die er braucht irgendwo verankert sind. ich kriege nach wie vor, wenn ich die host anwendung starte, die meldung: EClassNotFound 'Klasse TZipBuilder' nicht gefunden.



  • woruaf muss ich denn genau achten? was darf in der host anwendung und in der dll nicht gleichzeitig vorkommen? etc.?



  • kann das auch vorkommen wenn z.b. die *.bpr datei fehlende libs enthält? wie macht ihr das z.b. wenn ihr eine DLL schreibt und dort komponenten benutzt? wie wisst ihr welche includes und pragma anweisungen notwendig sind? ich mache es so, dass ich ein normales leeres projekt erzeuge und dann alle benötigten komponenten dort drauf setze um später zu wissen was ich benötige



  • Hallo

    das funktioniert leider auch nicht. hatte es am anfang so.

    Bei "funktioniert nicht" können wir auch nicht helfen...
    Also nochmal meine Frage : Brauchst du die VCL-Streaming-Eigenschaft der KLassen überhaupt?

    woruaf muss ich denn genau achten? was darf in der host anwendung und in der dll nicht gleichzeitig vorkommen? etc.?

    Wie schon mal gesagt würden doppelte Symbole Compiler bzw- Linkerfehler verursachen.

    TerraBox schrieb:

    kann das auch vorkommen wenn z.b. die *.bpr datei fehlende libs enthält?

    Nein. Fehlende Libs verursachen Linker-Fehler, während du eine Exception zur Laufzeit bekommst.

    wie macht ihr das z.b. wenn ihr eine DLL schreibt und dort komponenten benutzt? wie wisst ihr welche includes und pragma anweisungen notwendig sind?

    Jede vernünftige DLL, insbesondere die die ich selber schreibe, hat eine ausreichende Interface-Beschreibung wo drinsteht was man includen muß.



  • hallo akari und danke für deine erneute bemühung mir zu helfen.

    Brauchst du die VCL-Streaming-Eigenschaft der KLassen überhaupt?

    wie genau meinst du das? ich möchte im endeffekt einfach eine instanz dieser komponenten bzw. klassen nutzen können. teilweise sogar ohne instanz und nur als zeiger (z.b. bei methoden parameter).

    Wie schon mal gesagt würden doppelte Symbole Compiler bzw- Linkerfehler verursachen.

    das schon aber was ich damit meine ist, wenn die exe anwendung z.b. gewisse objekte gelinkt hat, welche dann die dll auch linken muss, sollte das doch keine probleme geben oder? ich muss ja dem compiler bekannt geben, das die verwendeten externals irgendwo sind.

    ich verstehe einfach nicht was ich falsch mache. möchte doch nur komponenten wie klassen benutzen. sie ganz nromal instanzieren, benutzen und wieder freigeben. das kann doch nicht so schwer sein?


Anmelden zum Antworten