|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ZeroCool Mini JLI'ler
Anmeldedatum: 26.01.2005 Beiträge: 15
Medaillen: Keine
|
Verfasst am: 18.10.2005, 14:06 Titel: DLL...??? |
|
|
Hallo,
hab folgendes Problem:
Ich will eine dll schreiben. gesagt getan.
aber wie kann man die Funktionen aus der dll nutzen???
muss man die noch irgendwie in der veröffentlich, oder wie geht das???
Gruss
Sergius |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 18.10.2005, 15:14 Titel: |
|
|
Du musst dir deine DLL-Funktionen veröffentlichen. Wenn du in deiner DLL keine kompletten Klassen veröffentlichen willst, geht das recht einfach: Der header deiner Funktion muss mit CPP: | __declspec(dllexport) | markeirt werden. Der Linker bastelt dann aus dieser Information eine DLL und eine LIB-Datei. Die DLL ist für den Programmaufruf wichtig, die LIB für den Linker des Programms, das die DLL verwendn will. Diese LIB muss also in die Projekteinstellungen des Anwendungsprogrammes mit aufgenommen werden.
Des weiteren muss der Prototyp der Funktion, die du aus der DLL importieren willst dem Anwendungsprogramm bekannt sein. Es handelt sich dabei um den gleichen Funktionsprototyp, der auch im Header der DLL zu finden ist - diesmal nur mit der Markierung CPP: | __declspec(dllimport) | Am Besten ist es also, den Header der DLL so einzubinden, dass er, wenn er von der DLL kompiliert wird ein dllexport vor die funktion schreibt und wenn er vom Anwendungsprogramm eingebunden wird ein dllimport...
Dazu macht man einfach ein Makro, welches eine Definition nutzt, die nur in während der DLL-Kompilation existiert.
Das Visual Studio erstellt eine solche Präprozessordefinition, wenn ein neues DLL-Projekt angelegt wird, welche den Namen XYZ_EXPORTS trägt (Wenn deine DLL XYZ.dll ist).
nun erstellt man das Makro CPP: | #idfef XYZ_EXPORTS
#define XYZ_API __declspec(dllexport)
#else
#define XYZ_API __declspec(dllimport)
#endif | im Header der DLL und nutzt dann XYZ_API für jede zu exportierende FUnktion.
Das Anwendungsprogramm (dass während des Kompiliertvorgangs das Makro XYZ_EXPORTS nicht kennt) weiss dann, dass die Funktionen aus diesem Header importiert werden müssen. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
ZeroCool Mini JLI'ler
Anmeldedatum: 26.01.2005 Beiträge: 15
Medaillen: Keine
|
Verfasst am: 18.10.2005, 15:22 Titel: |
|
|
ok super danke.
Habe aber immer noch ein Problem.
Es klappt zwar alles aber wenn ich nun einen string in dem funktions auruf oder als rückgabe wert habe, macht er es nicht.WIESO??
beispiel: main.h
CPP: | #ifndef MAIN_H
#define MAIN_H
#include <windows.h>
#include <string>
#define _DLL __declspec( dllexport )
#ifdef _DLL
#define DLL_EXPORT __declspec( dllexport )
#else
#define DLL_EXPORT __declspec( dllimport )
#endif
extern DLL_EXPORT char* sFunktion();
DLL_EXPORT int iFunktion();
DLL_EXPORT void pFunktion(string* ptr);
DLL_EXPORT string spFunktion(string* ptr, int* zahl);
#endif
|
main.cpp
CPP: | #include "main.h"
DLL_EXPORT char* sFunktion()
{
char b;
b = 's';
char* a;
a = &b;
return a;
}
DLL_EXPORT int iFunktion()
{
return 18102005;
}
DLL_EXPORT void pFunktion(string* ptr)
{
string a = "Pointer übergabe geht";
ptr = &a;
}
DLL_EXPORT string spFunktion(string* ptr, int* zahl)
{
int a = 18102005;
string t = "Wenn hier das selbe steht wie in der Rückgabe dann stimmt es 18102005";
zahl = &a;
ptr = &t;
return "Wenn hier das selbe steht wie in der Rückgabe dann stimmt es 18102005";
}
|
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 18.10.2005, 15:32 Titel: |
|
|
die Definition in deinem Header ist vollkommener Quatsch. So wird die Funktion immer exportiert...
Wenn dein DLL-Projekt TestDll heisst, dann schreibe in deinem Header folgendes: CPP: | #praga once
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
TESTDLL_API int MeineFunktion(int Foo); |
In der CPP-Datei steht dann noch folgendes: CPP: | #include "testdll.h"
int MeineFunktion(int Foo)
{
return Foo+7;
} |
Damit sollte alles klappen _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 18.10.2005, 15:32 Titel: |
|
|
Der String t wird ja nach der Funktion spFunktion wieder aus dem Speicher gelöscht. Also wird der Zeiger ptr ungültig. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
ZeroCool Mini JLI'ler
Anmeldedatum: 26.01.2005 Beiträge: 15
Medaillen: Keine
|
Verfasst am: 19.10.2005, 09:19 Titel: |
|
|
hat sich erledigt!!! |
|
Nach oben |
|
|
|
|
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
|