Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Klassen in DLLs

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.05.2006, 12:39 Uhr
theosoft



Nach mühevoller Kleinarbeit kann ich DLLs erzeugen und Funktionen aus den DLLs auch nutzen (via lib-Datei). Das gilt auch für einzelne Methoden aus Klassen.

Was mir nicht gelingt: Klassen mit allen Eigenschaften und Methoden in einer DLL unterzubringen und diese dann zu linken, damit mir die ganze Funktionalität der Klasse zur Verfügung steht.
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.05.2006, 15:40 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Solltest du möglichst auch nicht machen weil es da keinen festen Standard gibt. D.h. jeder Compiler bzw Compilerhersteller kann da seine eigenen Eigenarten haben, sodass du dann eine DLL die mit einem Borland Compiler erstellt wurde und eine Klasse exportiert nicht mit einer Visual C++ Anwendung verwenden kannst...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.05.2006, 16:26 Uhr
theosoft



Danke für die Antwort.
Ich werde einzelne Funktionen in die DLL packen.

Bei GUI-Programmen wäre es aber nicht schlecht, wenn man eine komplette Klassen-Unit in eine DLL packen könnte, selbst mit dem Nachtei, auf eine IDE begrenzt zu sein.
Würde das mit meiner alten Version 4 des Borland c++ Builders überhaupt gehen?
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.05.2006, 17:35 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


und wo genau ist das Problem? Ne Klasse wird genauso wie ne Funktion ex-/importiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.05.2006, 18:30 Uhr
theosoft



Ich weiss nicht wo genau das Problem ist ... aber so wie bei der Funktion klappt es bei der Klasse nicht - ich mache da wohl was grundlegendes falsch!?

Programm das sie DLL benutzt: Schnipsel aus dem Header

C++:
int doppel(int);

class Crechnen
{
   public:
   int addieren(int);
};



Programm das die DLL benutzt - CPP-Code

C++:
//---------------------------------------------------------------------------
__fastcall Tuser_Form::Tuser_Form(TComponent* Owner)
        : TForm(Owner)
{
  Label1->Caption = doppel(9);               // zeigt 18
}
//---------------------------------------------------------------------------

void __fastcall Tuser_Form::FormClick(TObject *Sender)
{
  Label1->Caption = rechnen->addieren(1);    // funkt nicht!
}
//---------------------------------------------------------------------------


Diese Fehlermeldung kommt vom Linker:
[Linker Fehler] Unresolved external 'Crechnen::addieren(int)' referenced from ...\DLL_USER.OBJ.

hier jetzt ein Schnipsel aus der DLL

C++:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
        return 1;
}
//---------------------------------------------------------------------------
__declspec(dllexport) int doppel(int _einfach)
{
  return (2 * _einfach);
}
//---------------------------------------------------------------------------

//__declspec(dllexport) class Crechnen  // beides funkt nicht
class __declspec(dllexport) Crechnen
{
   public:
   int addieren(int _zahl)
   {
     return (200 + _zahl);
   }
};
//---------------------------------------------------------------------------


Die Funktion "doppel" kann ich verwenden, die Methode "addieren" aus der Klasse Crechnen spielt nicht mit
--
ifS (immer fröhliches Schaffen)
theosoft

Dieser Post wurde am 29.05.2006 um 18:35 Uhr von theosoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.05.2006, 19:04 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


1. Importierst du die Klasse nirgendwo, sondern definierst in deinem Header eine neue.
2. Bei "rechnen->addieren(1)": Wo soll denn deine Instan "rechnen" plötzlich herkommen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.05.2006, 19:25 Uhr
theosoft



thx ... aber es bleiben Fragen:
Ich habe dem Projekt die generierte *.lib hinzu gefügt. Das genügt wohl nicht zum Importieren!?
Ich habe im Header auch schon ...

C++:
class __declspec(dllimport) Crechnen
...

getestet, leider ohne Erfolg.

In meiner Anwendung habe ich schon

C++:
Crechnen *rechnen;

stehen, aber damit bilde ich dann wohl nur eine Instanz der Klasse aus meinem Header, die ja keine Implementationen enthält - hmmm fatal !

Aber warum funktioniert die Funktion "doppel" aus der DLL ?

Kann es sein, dass ich mich zu sehr an folgende Aussage geklammert habe?

Zitat von Gefürchteter Pirat:

Ne Klasse wird genauso wie ne Funktion ex-/importiert.


--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.05.2006, 09:36 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also in deiner DLL sollte irgendwo folgendes stehen:

C++:
class __declspec(dllexport) TEST
{
public:
   TEST();
private:
   int i;
};


und dann irgendwo halt die definition der Memberfunktionen

C++:
TEST::TEST()
{
   i =5;
}



und in deiner Anwendung die die Klasse exportieren soll musst du die .Lib Datei einbinden und die Klasse bekannt machen:

C++:
class __declspec(dllimport) TEST
{
public:
   TEST();
private:
   int i;
};



Das sollte so funktionieren, zumindest mit VC++

Dieser Post wurde am 30.05.2006 um 09:37 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.05.2006, 16:24 Uhr
theosoft



uppps, ich hab's euch mal wieder nicht leicht gemacht aber, jetzt hab' ich's.

Vielen Dank für eure Mühe und Geduld!

@Guybrush Threepwood: Wenn ich die Memberfunktion (in deinem Beispiel ist es der Konstruktor) intern - in der Klassendeklaration - vornehme funktioniert es nicht mehr.
Folgendes funktioniert nicht:

C++:
class __declspec(dllexport) Crechnen
{
   public:
   int addieren(int _zahl)
   {
     return (200 + _zahl);
   }
};


... aber so klappt es:

C++:
class __declspec(dllexport) Crechnen
{
  public:
  int addieren(int _zahl);
};

int Crechnen::addieren(int _zahl)
{
  return (200 + _zahl);
}


--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: