Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

1

20.05.2004, 20:21

DLL importiert Daten aus EXE

Also, ich verstehe fast nichts von DLL-Programmierung, ich habe eigentlich auch nicht vor, mich damit auseinanderzusetzen, aber ich habe folgendes Problem:

Ich habe ein Programm, welches dynamisch (mit LoadLibrary) eine DLL lädt und eine Funktion aus ihr aufruft. Diese Funktion benötigt aber Daten aus dem Programm. Wie soll ich das angehen?
Erst habe ich der Funktion als Parameter die Adressen der Daten gegeben. Die DLL-Funktion konnte die auch schön dereferenzieren und lesen, Standartdatentypen konnte sie auch verändern, sobald aber ein komplexer Datentyp dazu kam (STL-Datentypen wie vector oder string), die ja selbst mit Speicherreservierungen herumspielen, klappt das verändern nicht! (Ich denke mal, das liegt daran, dass es nicht geht, Speicher aus der EXE zu nutzen und dann in der DLL weiterzumachen). Jetzt frage ich: wie kann ich der DLL die Daten liefern, die die EXE erstellt hat? Kann ich die irgendwie so "global" machen, dass die DLL auch drauf zugreifen kann?
Ich hoffe, jemand kann mir helfen,

Vielen Dank,
Till

In Deinem Beitrag befinden sich noch Fehler.
Bitte bearbeite die rot markierten Stellen und lösche diesen Text.
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

2

20.05.2004, 21:03

Lass die DLL doch mit den Daten des Game "spielen". Lass die Daten im Game und gib der DLL ein Pointer drauf. Das mit std::vector usw ist bekannt. Du kannst aber bei aufrufe std::string &Bla machen, nur bei der Rückgabe (return) spinnt das :/

Samuel G.

Treue Seele

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

3

20.05.2004, 21:55

Nun ja...

Ne DLL mit LoadLibrary zu laden ist aber umständlich, weil man dann wissen muss, was die DLL exportiert und alle diese exportierten Symbole manuell laden. Vorschlag: Machs mit ner .lib! ;) ;)


Samuel G. }>
Quak

4

20.05.2004, 22:45

Zitat

Ne DLL mit LoadLibrary zu laden ist aber umständlich, weil man dann wissen muss, was die DLL exportiert und alle diese exportierten Symbole manuell laden. Vorschlag: Machs mit ner .lib!


Falsch, du brauchst 1-2 funktionen maximal wenn du weisst wie es geht ^^

5

20.05.2004, 23:07

Wie man eine DLL lädt ist eigentlich egal. Was jedoch nicht geht ist, wenn man Speicher in der EXE Reserviert und diesen dann in der DLL löschen will. Das führt zu problemen mit den Zugriffsrechten für den Speicher und wird mit einem Programmabbruch quitiert.

Dann in einen solchen Speicher zu schreiben oder zu lesen ist jedeoch gar kein Problem. Das Problem mit den STL Komponenten kann man schnell umgehen, in dem man einen eigenen Allokator schreibt, der kein Template ist.

Das du Pointer an deine DLL Funktion übergibst war schon der richtig Anstz. Du darfst dann nur nicht diesen Speicher in der DLL löschen!

Was du auch machen kannst ist, einfach den new und delete Operator zu überladen und diese nicht als Inline sondern in einem Modul zu Implementieren. Dann wird der new und delete Operator automtisch auch von der STL genutzt und weg sind deine Speicherprobleme :)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

6

21.05.2004, 12:10

Danke erst mal für die Tipps.
Doch das dynamische Laden der DLL ist notwendig, da ich nie weiß, wie viele und welche DLLs der Benutzer einmal für meine EXE schreibt!

Aber würde es eigentlich nicht genügen, wenn die DLL Funktionen der EXE holt und diese benutzt(der Speicher wird ja dann wieder von der EXE verwaltet)? Denn das wäre mir sowieso lieber, dann kann die DLL nur das machen, was sie soll...
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

7

21.05.2004, 15:12

Mist! Damit geht's auch nicht :crying:
Die DLL benutzt zwar die Exe-Funktionen, dort gibt es auch keine Fehler, aber wenn die EXE das nächste mal auf die STL-Daten zugreifen will, gibt's Fehler...

@DragonMaster: Kannst du das mit dem new oder delete als nicht-inline-Implementierung ein wenig genauer erklären?
Oder wie man einen eigenen Allokator für STL schreibt?

Danke
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

8

22.05.2004, 06:26

Gern :)

Einen eigenen Allokator zu schreiben ist zwar möglich, aber recht Kompliziert, wenn man es mit der Überladung des new und delete Operators vergleicht.

Da du keine Globale Manager DLL hast, sondern die Operationen in der EXE von statten gehen, fällt mir im Moment keine bessere Idee ein, als eine weitere DLL zu erstellen, die dann besagte new und delete Operatoren Implementiert. Alle Komponenten benutzen dann diese DLL (EXE, PlugIn's etc). Dort kannst du vieleicht dann auch gleich Allgemeine Werkzeuge ablegen oder so.
Durch diesen kleinen Umweg passiert folgendes. Wenn irgendwo in deinem Projekt Speicheroperationen getätigt werden, passiert das immer über den Speicherbereich deiner Tool-DLL. Dadurch fallen bekannte Probleme mit der STL Stringklasse weg und auch deine Probleme.

Lesen und Schreiben in einen Speicherbereich ist immer erlaubt. Halt nur nicht das löschen nicht. Das ist auch das große Problem der STL. Da alles Templates sind und viel mit Referenzen gearbeitet wird. Mit obiger Methode verlagerst du das erstellen und löschen auf nur die eine DLL.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

9

22.05.2004, 08:34

OK, Danke, ich werd's probieren
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Till

Alter Hase

  • »Till« ist der Autor dieses Themas

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

10

29.05.2004, 15:41

Tut mir leid, dass ich mich erst so spät melde, aber ich war für EINE ganze Woche OHNE PC im Urlaub!
Naja, jedenfalls funktioniert es bei mir immer noch nicht!

Ich habe gedacht, new und delete in einem eigenen Modul zu überladen.
Ich denke, mit einer impliziten DLL-Bindung zu beiden anderen Modulen. Wenn ich innerhalb des eigenen Moduls überlade:

Quellcode

1
2
void *operator new(size_t size);
void operator delete(void *pMem);

dann funktioniert es! Aber ich muss die Operatoren ja exportieren bzw. importieren. Und sobald eine __declspec(dllexport) oder ...(dllimport) davor steht, kommt folgende Fehlermeldung:

Quellcode

1
error C2375: 'new' : Neudefinition; unterschiedliche Bindung


Also, was kann ich da machen?
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Werbeanzeige