JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Klasse aus DLL laden !?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 12.08.2006, 13:29    Titel: Klasse aus DLL laden !? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 13:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 14:16    Titel: Antworten mit Zitat

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 Wink

*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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 40
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 14:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 14:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 15:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 16:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 16:20    Titel: Antworten mit Zitat

PlugIn trifft es genau Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 16:27    Titel: Antworten mit Zitat

Mat hat Folgendes geschrieben:
PlugIn trifft es genau Wink


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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.08.2006, 16:47    Titel: Antworten mit Zitat

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 Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 13.08.2006, 23:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 14.08.2006, 00:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 14.08.2006, 00:31    Titel: Antworten mit Zitat

;(
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) Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 14.08.2006, 00:41    Titel: Antworten mit Zitat

Ich hab mal etwas gegooglet und auch etwas gefunden. Wenn es schon genannt wurde, dann bitte nicht böse sein, es ist schon spät. Wink

http://www.daniweb.com/tutorials/tutorial14329.html
http://www.codeproject.com/dll/noextensiondll.asp
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 14.08.2006, 00:46    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum