Bibliotheken
-
http://www.resourcecode.de/view.php?id=776
http://www.se.fh-heilbronn.de/usefulstuff/VCPLUS6/kap17.htm
-
Hallo
Vielen Dank.
chrische
-
Hallo
Ich glaube, ich bin echt zu blöd. Ich habe nun genau nach dieser Methode http://www.resourcecode.de/view.php?id=776 egearbeitet und bekomme immer eine Warnung und 3 Fehlermeldungen:
Warnung:
C4091 'keyword' : ignored on left of 'type' when no variable isdeclared
Fehler:
Error 1 error LNK2019: unresolved external symbol "int __cdecl Get(struct STRUKTUR)" (?Get@@YAHUSTRUKTUR@@@Z) referenced in function _main check.obj
Error 2 error LNK2019: unresolved external symbol "void __cdecl Set(struct STRUKTUR &,int)" (?Set@@YAXAAUSTRUKTUR@@H@Z) referenced in function _main check.obj
Error 3 fatal error LNK1120: 2 unresolved externals C:\Dokumente und Einstellungen\The Checker\Eigene Dateien\Visual Studio 2005\Projects\check\Debug\check.exe 1Kann mir jemand helfen? Ich glaube, dass ich gerade mal wieder völlig auf dem Schlauch stehe.
chrische
-
Hast du die Lib Datei der DLL Datei bei dem Projekt mitgelinkt?
-
Hallo
In dem Artikel steht doch gar nichts von einer lib-Datei, also habe ich auch keine gelinkt. Wird diese zusammen mit der dll erstellt, oder muss ich diese noch extra erstellen? Ich habe von diesem Thema wirklioch gar keine Ahnung und es ist mir schon etwas peinlich, wie ich mich anstelle, aber ich hoffe, dass ich es bald, mit eurer Hilfe, habe.
chrische
-
Die Lib Datei wird mit der DLL Datei erstellt und liegt im gleichen Verzeichnis deiner DLL Datei. Diese musst du dann bei deinem Linker eintragen...
Keine Panik, es ist noch kein Meister vom Himmel gefallen.
-
Hallo zusammen,
ich habe mich wie chrische5 gerade eben auch anhand dieses Beispiels http://www.resourcecode.de/view.php?id=776 an das Thema dlls gewagt. Hatte auch den selben Fehler wie chrische5, habs aber nun mit
#pragma comment(lib,"dlltest.lib")hinbekommen.
Ok, es funktioniert nun alles, nur wundere ich mich etwas über die Handhabung der DLL. Wieso muss ich denn die .h-Datei der DLL in meinem Testprojekt nochmals inkludieren? Ist dann in der DLL quasi nur die cpp-Datei enthalten???
Dadurch verliert die DLL ja ihren Sinn des Versteckens von Code, wenn der Anwender alle Funktionsdefinitionen sieht. (Dort könnten ja auch Funktionen ohne __declspec(dllexport) stehen)Ich glaube ich habe das Handling von dlls noch nicht ganz verstanden, kennt jemand noch ein gutes Tutorial dazu? (von denen die guenni81 vorgeschlagen hat finde ich das erste ziemlich mies, das 2. ist mir zu ausführlich und zu speziell, das fängt gleich mit MFC-dlls an...)
Gruß Brainiac
-
@Brainiac
Du kannst unter www.codeproject.com noch nachschauen. Es gibt noch eine zweite Möglichkeit eine DLL Datei zu laden. Hier entfällt dann das einbinden der Header Datei. Das laden der DLL geht damm mit AfxLoadLibrary von statten.
http://www.codeproject.com/dll/
-
Hallo
Ich würde gerne noch wissen, wie ich verschieden Klassen zu einer dll "vereinen" kann. Wenn ich das richtig verstanden habe, gibt es immer eine Header und eine Source Datei. Ich habe die Klassen nun aber in jeweils eingenen Dateien. Kann man diese dann einfach dem Projekt hinzufügen?
chrische
-
Du kannst mehrere Header und Source Dateien deiner DLL Datei /Projekt hinzufügen, dies ist kein Problem. Beim Kompilieren am Schluss wird alles in diese DLL Datei gepackt.
-
Hallo
Aber ich muss die zusätzlichen Headerdateien doch in der dlltest.h einbinden, oder? Wenn ich dies mache, muss ich, wenn ich die dll benutze dann auch die zusätzlichen Headerdateien mit zu meinen Projekt nehmen, weil er sonst die Header ja nicht öffnen kann. Stimmt das?
chrische
-
Du musst die headerdateien die du der dll datei hinzugefügt hast nirgendswo in der DLL Datei einbinden wenn du diese dort nicht benötigst.
In der EXE Datei musst du die headerdateien der DLL Datei einbinden, damit dieser die Klassen kennt.
-
Hallo
Da ich mir nicht sicher bin, ob ich jetzt totalen Mist mache, zeige ich mal meine Arbeitsschritte:
1. neues Projekt (dll) mit dem Namen dlltest
2. es wird eine dlltest.h und eine dlltest.cpp Datei erzeugt
2. hinzufügen von einer Header- und einer Sourcedatei einer Klasse (Name: Logfile.h und Logfile.cpp
3. dann kompilieren
4. neues Testprojekt anlegen
5. dlltest.h hinzufügen und inklidieren
6. dlltest.lib linken
7. wenn ich jetzt eine Instanz von Logfile anlegen will, dann meckert er immer, dass er den Bezeichneer nicht kennt.chrische
-
Ist so aber korrekt.
Wie sieht den die Klassendeklaration von der Logfile Klasse aus?
-
Hallo
Also ich habe jetzt noch einmal rumprobiert und musste feststellen, dass wenn ich ein dll Projekt erstelle keine Headerdatei generiert wird. Dann habe ich also eine Header und eine Sourcedsatei mit den Namen dlltest.h und dlltest.ccp. Ich füge diese also dem Projekt hinzu. Dann habe ich probiert eine kleine Klasse Test zu schreiben, welche nur etwas auf dem Bildschirm ausgibt. Die Headerdatei von Test muss ich nun nicht in dlltest.h inkludieren. Das bedeutet doch aber, dass in dlltest.h nichts steht. Zu was brauche ich die Datei dann überhaupt? Wenn ich die Test.h in der dlltest.h inkludieren muss, habe ich ja immer das Problem, dass wenn ich die dlltest.h in mein Projekt inkludiere er dann natürlich die Test.h nicht findet.
Es tut mir echt Leid, aber ich kapiere es wirklich nicht.chrische
-
Du erstellst ein DLL Projekt (in deinem Fall dlltest). Hier fügst du die benötigten Klassen die du später in dieser DLL Datei haben willst dem DLL Projekt hinzu (nicht includieren, sondern die Dateien dem Projekt hinzufügen). Hier musst du beachten das die Klassen mit dem Wörtchen AFX_EXT_CLASS oder __declspec(dllexport) deklarierst.
Bei MFC Dll Dateien musst du die erste Variante nehmen.
Bsp.class AFX_EXT_CLASS Irgendwas : public CObject {};Nun kannst du dein Projekt erstellen und und die header Datei aus dem DLL Projekt einbinden. Dann noch die Lib Datei mitlinken und das wars...
-
Hallo
Das bedeutet also, dass die dlltest.h, die ich neu hinzugefügz habe komplett leer ist? Ich werde das nachher mal probieren.
chrische
-
chrische5 schrieb:
Hallo
Das bedeutet also, dass die dlltest.h, die ich neu hinzugefügz habe komplett leer ist? Ich werde das nachher mal probieren.
chrische
Bei der header und source datei die automatisch erstellt werden beim projekt brauchst du nix zu ändern und kannst diese gerne ignorieren.
-
Hallo
Weil es immer noch nicht klappt hier mal die Dateien:
Dlltest.h und dlltest.cpp sind komplett leer. Wenn ich ein dll-Projekt starte, wird keine Headerdatei erstellt, also erstell ich immer ein Projekt und lösche alles aus der cpp-Datei. Vielleicht ist das ja das Problem.
Test.h:
#pragma once class __declspec(dllexport) Test { public: Test(void); ~Test(void); void out(void); };Test.cpp:
#include "StdAfx.h" #include "Test.h" #include <iostream> Test::Test(void) { } Test::~Test(void) { } void Test::out(void) { std::cout<<"Hallo"; }Diese Dateien habe ich zum Projekt dlltest hinzugefügt. Nun kompiliere ich das Projekt und es entsteht eine dlltest.dll und eine dlltest.lib
Nun das Projekt mit dem ich die Dll prüfe. Ich nenne es checkdll
Checkdll.cpp:
#include "stdafx.h" #pragma comment(lib,"dlltest.lib") #include "dlltest.h" int _tmain(int argc, _TCHAR* argv[]) { Test Hallo; return 0; }Er findet aber die Klasse Test nicht. Ich habe zu checkdll dlltest hinzugefügt und ich habe dlltest.dll zum Projekt hinzugefügt.
Vielen Dank für Eure (deine) Geduld.chrische