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

Anonymous

unregistriert

1

04.02.2004, 12:19

Win32 Dynamic Link Libary

Hi, ich weiss es gibt schom mehrere Threads zu diesem Thema, aber ich habe da grundlegende Probleme und hoffe wir kann jemand helfen.

Was will ich machen?
Ich will eine DLL und LIB erzeugen, die wie bei der TriBase Engine, die allgemienen Dateien beinhaltet, die ich dann nur noch in Form einer lib einbinden muss + dll.

Mein Problem?
1. Ich weiss nicht richtig was ich in das DLL Projekt bei VS reinpacken soll.
Kommen z.B. die ganzen Header und cpp Files wie Vector.h und Vector.cpp in dieses Projekt. Ich denke ja schon, aber bin mir nicht sicher.

2. Was sollte man beim erstellen einer DLL nicht vergessen, wenn man z.B. nicht wirklich weiss wie es funktioniert

Fazit:
Hat jemand ein gutes Tutorial für mich, wie ich ein DLL mit Hilfe von VS.NET erzeuge oder andere Hilfen, wie das grundlegend Funktioniert?

thx, bE :ohoh:

Maxi

Treue Seele

Beiträge: 136

Wohnort: Müncheberg

Beruf: Ich muss noch in die Schule

  • Private Nachricht senden

2

05.02.2004, 11:33

also, es sit eigentlich gar nicht so schwer

Zuerst musst du ein DLL-Projekt erstellen

anfangen tust du mit diesem makro:

#define DLLEXPORT cdeclspec(dllexport)

So, dann schreibst du alles, was du brauchst, also wenn es eine eingine sein soll, dann alles, was zu dieser engine gehört (Klassen, Sturkturen.... usw.)
und setzt zB bei Klassen das DLLEXPORT so ein:

class DLLEXPORT xxx
{
};

Versuch am besten erstmal eine einfache Funktion zu erstellen, zB so:

// Header:
DLLEXPORT void TestFunc();

// Main-Datei

void TestFunc()
{
MessagegBox(NULL, "Test", "Msg", NULL);
};

DAnn kompilierst du das ganze. Es wird eine Lib erstellt.

Wenn du dann ein neues Projekt startest(win32), dann musst du da die Lib einbinden, den Header inkludieren, und dann kannst du einfach die Fkt TestFunc ganz normal aufurfen.

Und so geht das mit allen anderen sachen auch
Gruß, Maxi

Hier, die Homepage von meiner Band:
www.maxis-house.de

Könnt euch unsere ersten Songs saugen...

Anonymous

unregistriert

3

05.02.2004, 12:03

Re:

Ok, danke. Es hat jetzt auch geklappt mit der dll Erzeugung.

Aber es gibt noch ein paar Dinge, die ich nicht verstehe:
1. Muss ich die erzeugte .lib (die im Debug Ordner liegt) irgendwo hinkopieren, damit ich sie in allen Projekten nutzen kann.
Ausser beim Linker einzubinden, ich meine wirklich die Datei an sich!?

2. Wenn ich die Header einbinde, dann kommt immer ein "No such file or directory". Ich binde die Header über <Engine.h> ein, hab auch schon "Engine.h" probiert und die Header ins gleiche Verzeichnis kopiert, ging aber beides nicht. Wohin muss die Headerdatei?

Anonymous

unregistriert

4

05.02.2004, 12:54

Header einbinden

Ich hab jetzt nur als Lösung gefunden, bei include als Pfad eine absolute Adresse anzugeben, das macht sich aber natürlich nicht sehr schön.

Wie kann man die Engine Header einbinden mit <Engine.h>, so wie das auch bei der TriBase Engine gemacht wird?

???

5

05.02.2004, 14:53

Die Header sowie die LIB-Datei werden nur in bestimmten Verzeichnissen gesucht. Diese kannst du in den Einstellungen angeben. Am besten machst du das so.

1) Du erstellst ganz normal deine DLL Datei mit allem drum und drann.
2) Dann startest du dein EXE-Projekt.
3) Kopiere deine DLL-Header in das Hauptverzeichnis deines EXE-Projektes. Die LIB-Datei kannste gleich mit Kopieren :)
4) Kopiere deine DLL in den Debug/Release Ordner, wo auch die EXE Datei liegt.

Schon ists fertig und du kannst mit #include "dll_header.h" deine Header einbinden und einfach my_dll.lib zum Projekt binden.

Noch ein wichtiger Hinweis:
Sollte man immer wissen, denn viele sind drüber gestolpert ;D. Die DLL verwendet ihren eigenen Heap. Man Arbeitet also mit zweien. Dem der EXE und dem der DLL. Wenn du Speicher in der EXE Reservierst darfst du denn nicht in der DLL freigeben. Das gilt natürlich auch in die andere Richtung. Das führt nämlich zu einer hübschen Fehlermeldung ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

6

05.02.2004, 15:44

Bekomm es nicht hin

Also ich hab das jetzt so gemacht wie du sagtest DragonMaster, eigentlich hatte ich das vorher auch so, nur die .lib hatte ich nicht in den Ordner kopiert.
Auf jeden Fall, funktioniert es immer noch nicht.
Ich hab mir mal angekuckt wie das bei den Beispiel-Progs von dem Buch ist und er hat ja im Prinzip auch nur die Dateien, Resourcen und DLLs in einem Ordner. Und er ruft die Header mit <TriBase.h> auf?

Ich versteh das nicht wirklich, warum das bei mir nicht geht.

Ich hab die DLL in den Ordner kopiert, einmal in den Hauptordner und in den Debug Ordner. Die LIB auch (so wie du sagtest).
Im Code steht dann an erster Stelle #include <Engine.h> oder selbst bei #include "Engine.h" kommt bei jeder Datei der gleiche Fehlen, den ich ja schon erwähnt hatte.
Wenn ich den absoluten Link zu der Header im Projektverzeichnis der Engine angebe, dann geht es, aber das ist ziemlich dumm, weil man erstens die Engine immer mit geben müsste und sie immer im selben Pfad liegen müsste.

damn, ich weiss nicht weiter :crying:

Anonymous

unregistriert

7

05.02.2004, 15:53

Absoluter Pfad

Also ich denk daran sieht man das eigentlich Probleme.
Es kann ja nicht stimmen das ich die Header Datei von der Festplatte wirklich aufrufen muss.

Leider versteh ich auch nicht wirklich wie das jetzt mit der DLL oder der LIB zusammenhängt und ob vielleicht dort schon das Problem liegt!

Hoffe jemand hat eine Idee, ich bin für alles dankbar! :help:

8

05.02.2004, 15:59

Also an der DLL und der LIB liegt es nicht.

Pass auf: Der Compiler sucht die Header nur in den Verzeichnissen die u ihm angibts. Dabei unterscheidet er

1) #include "header.h" und
2) #include <header.h>

Wenn du 1 angibst sucht er die Header nur in dem Hauptverzeichnis deines Projektes. Bei mir z.B. wäre das z.B. "d:\programmieren\MyProjekt\header.h". Bei 2 sucht er sowohl im Hauptverzeichnis deines Projektes als auch in den Verzeichnisen die du in der IDE festgelegt hast. Das können z.B. Globale Einstellungen sein als auch Lokale bei den Projekteinstellungen.
Wenn dort keine header.h zu finden ist bekommst du den Fehler. Bei LIBS sieht es in etwa gleich aus. Nur ohne das #include halt.

Finden von DLL Dateien:
Diese werden nicht von der IDE gesucht sondern von Windows selbst. Sie sucht eine DLL erst in dem Ordner in dem auch die EXE liegt, dann im Windows Ordner dann im Windows System Ordner und noch ein paar andere glaub ich.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

9

05.02.2004, 16:09

Header

Ich bin dir wirklich dankbar für deine Hilfe DragonMaster, aber im Prinzip weiss ich das und ich versteh auch nicht wie mir das bei meinem Problem hilft.
Aber ich will versuchen es nochmal klar zu machen (ich schreib meistens ziemlich verwirrendes Zeug :wirbel: ).

1.) Ich programmier ein Spiel, nehmen wir das Breakanoid.
2.) damN, ich liebe es wenn ich jemand was schreiben will und mir fällt auf das nur ich schwachsinnig denke.

Ok neuer Versuch,
1) Wenn ich das Spiel kompiliere brauch ich die Header, also könnte das auch ruhig mein Projekt Ordner sein.
2.) Wenn ich das Spiel dann weitergebe, muss es ja nicht neu kompiliert werden, also brauch ich auch die Header nicht.

Gut ...
Angenommen ich würde dir jetzt mein Projekt schicken und du willst es neu kompilieren, dann brauchst du auch die Header der Engine, nur diese oder auch alle anderen Dateien der Engine?
Und wäre es dann angebracht, die Header einfach in den Spieleordner mit zu kopieren oder soll der jenige, in dem Fall du, die Header Datei der Engine in seinen System32 oder was auch immer Ordner kopieren.
( ich glaub es wird wieder confuse :rolleyes: ).

Weil David hat ja bei Breakanoid, seine Header Datei mit #include <TriBase.h> eingebunden, wenn ich das jetzt neu kompilieren, funktioniert das auch, auch ohne die Datei in den XYZ-Ordner zu kopieren und das ist mir unklar warum das geht. Puh ... schwere Geburt, hoffe du verstehst mich jetzt besser ;)

10

05.02.2004, 16:50

Weitergabe des Projektes:
Wenn du mir dein Spiel geben willst, mit Source, aber nicht die Engine selber, ist das kein Problem. Ich brauch dann nur die Header, LIB und die DLL zu der Engine. Wenn du mir den Source der Engine auch noch geben willst, brauch ich natürlich noch die cpp Dateien. Am besten den ganzen Projektordner.

@Rest:
Wenn wir über die Fehlermeldung

Zitat

fatal error C1083: Include-Datei kann nicht geöffnet werden: 'Tribase.h': No such file or director d:\Spiele\Breakanoid\Breakanoid.h
reden, hab ich dich schon verstanden. Also ich hab mir mal den Projektordner von David's CD geladen. Beim Kompilieren des Spiels Breakanoid kann er keine einzige Header der Engine finden. Ich weis auch warum. Ich muss ihm nämlich sagen wo die Header liegen. Das mach ich aber in den Projekteinstellungen des Spiels und nicht bei der Engine. Ohne dies geht es nicht. Das gleich gilt auch für die LIB.
Ich habe die TriBase irgendwo auf die Platte kopiert, dann in den Projekteinstellungen von Breakanoid die Ordner für Lib und Header angegeben. Brauche dann nischt am Code ändern.

[edit] Wenn Engine und Spiel zusammen Entwickelt werden und damit auch zusammen hängen, kannst du dein Projektverzeichnis deiner Engine als Unterordner in deinem Spielprojektornder angeben. Dann kannst du deine Verzeichnise in den Projekteinstellungen des Spiel festlegen und keiner brauch was einstellen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige