Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 25.11.2007, 09:32 Titel: ich brauch ne dll |
|
|
hallo,
ich suche jetzt schon MONATELANG nach gescheiten Tutorials wie man dlls in (v-)c++ schreibt. Es gibt auch einige, die ich allerdings nie verstehe.
Kann mir einer vielleicht den Quellcode einer dll mit einer Funktion hier posten und dazu dann den quellcode der sie dynamisch einbindet? Ich will nicht das ihr mir ein riesiges programm schreibt, ne funktion zum addieren von zwei zahlen reicht ja schon. Bitte, ich verzweifle!!! |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 25.11.2007, 10:18 Titel: |
|
|
Manchmal hilft auch der hauseigene Hilfesupport. Falls du Microsoft VC++ verwendest dann schai einfach in der Hilfe unter:
Vorgehensweise in Visual C++ Express -> Erste Schritte -> Exemplarische Vorgehensweise: Erstellen und Verwenden einer DLL (Dynamic Link Library)
oder gleich ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.de/dv_vcmcpp/html/3ae94848-44e7-4955-bbad-7d40f493e941.htm in die Adress Zeile eingeben.
Oder das Selbe für den Browser:
http://msdn2.microsoft.com/de-de/library/ms235636(VS.80).aspx
Wie mit anderen IDEs geht weiß ich net. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 25.11.2007, 18:39 Titel: |
|
|
die beschreibung auf der microsoftseite habe ich schon mal gefunden, fand ich aber komisch, weils bei mir nicht funktioniert hat. Das Tutorial auf der spieleprogrammiererseite sieht gut aus, guck ich mir auf jeden Fall an. Danke |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 19.06.2008, 13:42 Titel: |
|
|
ist schon ein bischen älter der thread, ich habs aber immernoch nicht geschaft vernünfige dlls zu benutzen.
Ich hab eine Dll erstellt deren code so aussieht:
test.h:
CPP: | #include <windows.h>
#ifdef BUILD_DLL
#define DLL_PORT __declspec(dllexport)
#else
#define DLL_PORT __declspec (dllimport)
#endif
extern "C" class DLL_PORT Klasse
{
public:
int add(int a, int b);
};
Klasse DLL_PORT GetInstance();
|
main.cpp:
CPP: | #include "test.h"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
return true;
}
int Klasse::add(int a, int b)
{
return a+b;
}
Klasse tmp;
Klasse GetInstance()
{
return tmp;
}
|
jetzt wollte ich die instanz der klasse in meinen testprogramm bekommen:
main.cpp:
CPP: | #include <iostream>
#include <windows.h>
#include "test.h"
int main()
{
HINSTANCE DllInst = LoadLibrary("sample.dll");
typedef Klasse (*DLLFUNC)(void);
DLLFUNC funktion = (DLLFUNC)GetProcAddress(DllInst, "GetInstance");
Klasse test = funktion();
system("pause");
return 0;
}
|
bekomme aber einen laufzeitfehler habt ihr ne idee? ich vermute mal mein kompletter code ist totaler müll, aber im internet hab ich nicht wirklich viel dazu gefunden, wie man ganze klassen aus ner dll verwendet. |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 19.06.2008, 17:07 Titel: |
|
|
Ja er ist Müll!
sample_dll.hpp
CPP: | #if !defined (SAMPLE_DLL_HPP__INCLUDED)
#define SAMPLE_DLL_HPP__INCLUDED
#include <windows.h>
#include <iostream>
#ifdef SAMPLE_DLL
#define SAMPLE_API __declspec(dllexport)
#else
#define SAMPLE_API __declspec (dllimport)
#endif
#include "show.hpp"
#endif // SAMPLE_DLL_HPP__INCLUDED |
sample_dll.cpp
CPP: | #include "sample_dll.hpp"
BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID)
{ return TRUE; } |
show.hpp
CPP: | #if !defined (SHOW_HPP__INCLUDED)
#define SHOW_HPP__INCLUDED
namespace sample_dll
{
struct SAMPLE_API Show
{
void addition(const unsigned int, const unsigned int);
};
}; // sample_dll
#endif // SHOW_HPP__INCLUDED |
show.cpp
CPP: | #include "sample_dll.hpp"
namespace sample_dll
{
void Show::addition(const unsigned int first, const unsigned int second)
{ std::cout << first + second; }
}; // sample_dll
| ...
so da haste das schon mal ...
Dann musse dem Compiler beim builden der DLL sagen, das SAMPLE_DLL definiert werden soll.
Dann die Anwendung, die die DLL nutzt:
CPP: | #pragma comment(lib, "sample_dll.lib")
#include "sample_dll.hpp"
int main()
{
sample_dll::Show instance;
instance.addition(10, 5);
} | ... und schon fertig Sollte dir dann 15 ausgeben
Zuletzt bearbeitet von Deviloper am 19.06.2008, 17:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 19.06.2008, 17:20 Titel: |
|
|
ähm, ich bekomme den linker fehler 2019:
Code: | main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall sample_dll::Show::addition(unsigned int,unsigned int)" (__imp_?addition@Show@sample_dll@@QAEXII@Z) referenced in function _main
|
läd der code die dll dynamisch? ich glaube nicht oder? |
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 19.06.2008, 17:35 Titel: |
|
|
Jetzt schon |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 19.06.2008, 18:32 Titel: |
|
|
jetzt links du die lib statisch, ich versuche aber die dynamisch mit loadlibrary() und freelibrary() zu laden |
|
Nach oben |
|
|
Bravo20 Mini JLI'ler
Anmeldedatum: 16.06.2008 Beiträge: 5
Medaillen: Keine
|
Verfasst am: 19.06.2008, 18:42 Titel: |
|
|
und was soll das bringen, wenn du dein programm kompiliert hast, wird er die dll auch dynamisch laden, das heist ohne die dll wird nichts laufen
oder hab ich da was nicht richtig mitbekommen |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.06.2008, 19:59 Titel: |
|
|
Bravo20 hat Folgendes geschrieben: | und was soll das bringen, wenn du dein programm kompiliert hast, wird er die dll auch dynamisch laden, das heist ohne die dll wird nichts laufen
oder hab ich da was nicht richtig mitbekommen |
Hast du. Denn man kann auch einfach während das Programm läuft im Code gucken, ob es ne bestimtme dll gibt, und die versuchen zu laden und dann die entsprechenden Sachen da raus hohlen. Ist halt für Plugins interessant.
Allerdings könnte es u. U. eine Überlegung wert sein, ob man statt einer dll nicht eine Skriptsprache seiner Wahl nehmen sollte. Die sind teilweise nicht viel langsamer, aber man kann Skripte schreiben ohne gleich eine dll kompilieren zu müssen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 20.06.2008, 13:14 Titel: |
|
|
ich möchte ein plugin-system schreiben. Ich weiß nicht ob das so sinnvoll ist directx als script zu benutzen |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 24.06.2008, 05:51 Titel: |
|
|
Zitat: | Ich weiß nicht ob das so sinnvoll ist directx als script zu benutze |
Du weisst es wirklich nicht mhh? Überlege inwiefern es Sinn macht DirectX als "Scriptsprache" zu verwenden.
Auch würde es mich interessieren wie du überhaupt auf diese Idee kommst.
Das mit dem dynamisch laden hättest du auch früher erwähnen können. Sobald du dich ein wenig in DLLs eingelesen hast wirst du sicher von selbst drauf kommen wie das funktioniert und ich hoffe doch sehr das hier keiner dir alles vorkauen wird |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 24.06.2008, 11:59 Titel: |
|
|
Ich glaube er mein "aus einem Skript heraus DX benutyen"
Ich sehe das so: Das Spiel an sich sollte das Grundgerüst sein, der ganze lowlevel Kram würde also in dem Hauptprogramm sein. Ein Skipt mag meinetwegen ein neues Objekt erstellen und steuern aber verwaltet und gerendert wird es von dem Spiel.
Z.b. würde in einem Spiel ein Skript die KI von einem Gegner steuern aber das ganze rechenintensive lowlevel zeug übernimmt das Spiel. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 24.06.2008, 12:19 Titel: |
|
|
Ich habe einen Plattform geschrieben, der man ganze Spiele hinzufügen kann. (so ähnlich wie Steam, nur deutlich primitiver^^).
Jetzt wollte ich das ganze DirectX-LowLevel-zeug in ne dll packen, damit die spiele, die man auch als dll hinzufügt darauf zugreifen können.
Frage: kann ich mit zwei applikationen (bzw dlls) das gleiche Direct3dDevice benutzen?
Nach Gefühl habe ich alle deutschen und englischen tutorials zum Thema dlls durch, die erklären aber irgendwie nie wie das mit Instanzen von Klassen funktioniert.
PS: Ich dachte das wäre klar, dass eine dymamic link library, die ich selber schreibe, auch dynamisch geladen werden soll, sonst könnte ich ne .lib oder .h datei schreiben |
|
Nach oben |
|
|
|