Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.08.2006, 13:29 Titel: Klasse aus DLL laden !? |
|
|
Hey,
ich habe in einer DLL eine Klasse exportiert, weiß aber nicht, wie ich an diese ran kommen soll.
Habe diese DLL standard mit
CPP: | HINSTANCE hLib=LoadLibrary(_path_dll.c_str()); | geladen.
GetProcAddress() wird mir hier wohl kaum helfen ;( _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.08.2006, 13:47 Titel: |
|
|
Hm, ich glabue das ist gar nicht so einfch, weil dll's eigentlich C sind und somit keine Klassen kennen.
Bei DirectX ist es jedenfalls so geamcht, das es eine Funktion gibt, die ein Klassenobjekt zurück gibt. Vielelchit veruschst du einfach sowas auch einzubauen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.08.2006, 14:16 Titel: |
|
|
Was mir die Hoffnung gemaacht hatte, war die Tatsache, dass in dem Beispielcode des VC6.0 Compilers eine Klasse exportiert wird.
Aber eingebunden wird diese ja nur statisch - wesshalb dies vermutlich möglich ist.
(Es gibt ja auch nicht wirklich einen Pointer zu einer Klasse, die man nicht kennt - wesshaln ein dynamisches Einbinden auch kaum realisierbar wäre - es sei denn über extern).
Das eine Funktion aber eine Referenz zurückgibt ist eine gute Idee - werde da mal ein bisschen rumbasteln
*EDIT*
Aber wie soll man auf die Klassenelemente zugreifen können ? der Compiler kennt die Klasse ja garnicht ;( _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 40 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 12.08.2006, 14:40 Titel: |
|
|
Hi!
Per LoadLibrary hast du keine Chance. Statisch klappts das allerdings ohne Probleme.
Einfach:
// Irgendwas.h
CPP: | #ifndef BLA
#define BLA __declspec( dllimport )
#endif
|
// Classname.h
CPP: | #include "Irgendwas.h"
//...
class BLA Classname
{};
|
Fürs exportieren muss BLA einfach gesetzt werden.
grüße |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.08.2006, 14:47 Titel: |
|
|
Ne, leider muss die Klasse (vom Programmkonzept her) dynamisch iengebunden werden.
Habe aber eine Idee, wobei ich nicht ganz weiß, wie ich sie umsetzen soll.
Ich gebe eine Funktion aus (aus der Bibliothek), die die Größe der Klasse ausgibt.
Nun ist die Frage ob man einen Zeiger erstellen kann, wenn man weiß wie groß die Struktur (hier eine Klasse) ist ?
Müsste doch eigendlich gehen, notfalls erstellt man eine Fakeklasse die einfach die gleiche größe hat (mit einem Array auffüllen) und missbraucht von ihr den Zeigertyp - wobei es sicherlich einfacher geht - einen Zeiger für eine bestimmt große Klasse zu erstellen.
Weiß einer wie das geht ? _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 12.08.2006, 15:32 Titel: |
|
|
Also ehrlich gesagt habe ich noch nicht so ganz verstanden was du machen willst und warum.
Du willst eine Klasse aus einer Dll laden?
Wenn du die Klasse in der exe verwendest, dann hat die exe wissen über die Klasse, d.h. du kannst sie auch in die exe einbinden.
Es kann aber sein, dass es wichtig ist die Klasse dynamisch an die exe zu binden um das verhalten der exe zu modifizieren. Dann bietet sich ein Interface an. D.h. alle Klassen die du aus der Dll dynamisch lädst implementieren ein Interface (Das bedeutet: alle Klassen die das interface implementieren haben mindestens alle Methoden die das Interface hat.). Du kannst die importierten Klassen dann nur über dies Interface benutzen.
Exe:
CPP: | class Interface
{
virtual void SichtbareMethode()=0;
};
|
Dll:
CPP: | class Implementierung : public Interface
{
virtual void SichtbareMethode(){};
void UnsichtbareMethode(){};
};
|
CPP: | Interface* CreateInstance()
{
return new Implementierung();
}
|
Die exe kann nun über die CreateInstance Methode der Dll neue implementierungen erstellen und verwenden. Allerdings kann UnsichtbareMethode aus der Exe nicht direkt aufgerufen werden. SichtbareMethode dagegen schon. SichtbareMethode kann wiederum UnsichtbareMethode aufrufen.
Siehe auch: ClassFactory _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.08.2006, 16:09 Titel: |
|
|
Jo, wofür man das braucht ist doch klar. Wenn man zum Beipsiel ein PlugIn system hat, oder die Gegner in einem Spiel ihr verhalten aus einer Dll haben, oder, oder oder. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 12.08.2006, 16:27 Titel: |
|
|
Mat hat Folgendes geschrieben: | PlugIn trifft es genau  |
Dann ist die ClassFactory die Lösung.
Du solltest dabei auch sicherstellen, dass du "Multithreaded Dll" als Einstellung verwendest.
Multithreaded Dll _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.08.2006, 16:47 Titel: |
|
|
Zitat: |
Warnung:
Die FactoryManager-Klasse ist ein Klassen-Template und die Register<Klasse>(...) Methode ist ein Methoden-Template. Die FactoryManager-Klasse lässt sich deshalb nur auf neueren Compilern kompilieren ( VS.NET ) (war bei mir jedenfalls so). |
Ich arbeite mit VC6.0 ist daher schlecht, außerdem habe ich eigendlich alles fertig implementiert was zum PlugIn-System gehört, außer das eigednliche Laden der dll.
Das mit den Interfaces sollte desshalb auch genügen.
Ich schaue mal ob ich das damit wie gewüscht hinbekomme, ansonten melde ich mcih nochmal  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 13.08.2006, 23:29 Titel: |
|
|
So, da muss ich mich wohl nocheinmal melden:
Also wie ich das nun verstanden habe muss man mit com-Objekten arbeiten um an die Klasse praktikabel heran zu kommen.
Weil ich damit keinerlei Erfahrung habe, will ich nun doch ein Class Factory verwenden.
Wie schon erwähnt kann ich die Implementierung von Kampfhund nicht nutzen ;(
Aber ich bin mir sicher das es da noch andere Gute gibt. Habe schon gesucht und gesucht aber nicht wirklich mit den Ergebnissen zu frieden.
Kann mir da jemand was empfehlen ? _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 14.08.2006, 00:05 Titel: |
|
|
Probier mal ob dies kompiliert:
CPP: | #include <iostream>
#include <map>
#include <string>
class Interface
{
public:
virtual void do_something()=0;
};
class Implementation : public Interface
{
public:
virtual void do_something()
{
std::cout<<"do"<<std::endl;
}
};
// EDIT: veraltete zeile gelöscht
template<class I>
struct IFactory
{
virtual I* CreateInstance()
{
throw "";
};
};
template<class I,class C>
struct Factory : public IFactory<I>
{
virtual I* CreateInstance()
{
return dynamic_cast<I*>(new C());
}
};
int main()
{
std::map<std::string,IFactory<Interface>* > mFactoryMap;
mFactoryMap.insert(
std::make_pair(
"Blub",
new Factory<Interface,Implementation>
)
);
mFactoryMap["Blub"]->CreateInstance()->do_something();
return 1;
}
|
_________________ Kochen ist ein NP-schweres Optimierungsproblem.
Zuletzt bearbeitet von Kampfhund am 14.08.2006, 18:01, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 14.08.2006, 00:31 Titel: |
|
|
;(
Hier schreit
CPP: | mFactoryMap.insert(
std::make_pair(
"Blub",
new Factory<Interface,Implementation>
)
); |
Nach einem Fehler:
c:\coding\c++\vc98\include\utility(21) : error C2536: 'std::pair<char [5],struct Factory<class Interface,class Implementation> *>::first' : Angabe einer expliziten Initialisierung fuer Felder nicht moeglich
c:\coding\c++\vc98\include\utility(25) : Siehe Deklaration von 'first'
c:\coding\c++\vc98\include\utility(21) : Bei der Kompilierung der Member-Funktion '__thiscall std::pair<char [5],struct Factory<class Interface,class Implementation> *>::std::pair<char [5],struct Factory<class Interface,class Implementation>
*>(const char (&)[5],struct Factory<class Interface,class Implementation> *const & )' der Klassenvorlage
Fehler beim Ausführen von cl.exe.
Aber sonst siehts gut aus - bis auf die notwendigkeit von #pragma warning(disable : 4786)  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 14.08.2006, 00:46 Titel: |
|
|
@Dragon
Sorry, aber ist leider beides statisch gebunden ;(
Die Kopplung soll jedoch dynamisch erfolgen. _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
|