Reine C++ Projekt erstellen und anwenden.
-
Es wurde erledigt aber die genannten warnungen sind immer noch da
-
Hallo wenn ich meine Person.h so umschreibe:
#pragma once #include <iostream> #include <string> #include <windows.h> //#ifdef _DLL_ //# define DLLIMPORT __declspec(dllexport) //#else //# define DLLIMPORT __declspec(dllimport) //#endif class __declspec(dllexport) Person { std::string _sName; std::string _sVorname; std::string _sGeschlecht; int _iAlter; public: Person(); Person(std::string sName, std::string sVorname, std::string sGeschlecht, int iAlter); ~Person(); const std::string GetName(); const std::string GetVorname(); const std::string GetGeschlecht(); const int GetAlter(); void SetName(const std::string sName); void SetVorname(const std::string sVorname); void SetGeschlecht(const std::string sGeschlecht); void SetAlter(const int iAlter); std::string SagHallo(); };Ich bekomme denn keine Warnung mehr
-
Niko_gast schrieb:
Hallo wenn ich meine Person.h so umschreibe:
Ich bekomme denn keine Warnung mehr
Du kannst diesen Header dann aber nicht mehr in Programmen verwenden, die die DLL benutzen sollen. Die brauchen an dieser Stelle dllimport.
Steht DLLIMPORT bei allen Methodendefinitionen?
-
Hast du denn in deinem DLL-Projekt das Symbol "_DLL_" über die Projekt-Einstellungen auch definiert? (Findest du über C/C++ -> Präprozessor, dort sollte es bei den Präprozessordefinitionen eingetragen sein.)
Bei deinen Projekten, die die DLL dann verwenden aber nicht.
@firefly: jup des mit der lib bei einer dll hab ich irgendwie verdrängt

Mfg mdn
-
[quote="MFK"]
Niko_gast schrieb:
Steht DLLIMPORT bei allen Methodendefinitionen?
Nein
Person.cpp Teil ist gleich geblieben
-
Marc-O schrieb:
Hast du denn in deinem DLL-Projekt das Symbol "_DLL_" über die Projekt-Einstellungen auch definiert? (Findest du über C/C++ -> Präprozessor, dort sollte es bei den Präprozessordefinitionen eingetragen sein.)
Mfg mdnes ist genau das
danke
-
Hallo,
ich muss noch mal fragen
ich will jetzt den erzeugten DLL einfach testen
Es gibt zwei Möglichkeiten: ich habe mich für die schwierige entschieden.
ich bin so vorgegangen:C++ projekt erstellen als Console Anwendung:
main.cpp// CPP_DLL_Test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string> #include <iostream> #include <windows.h> typedef string (*GetName)(); typedef string (*GetVorname)(); typedef string (*GetGeschlecht)(); typedef int (*GetAlter)(); int main() { GetName _GetName; GetVorname _GetVorname; GetGeschlecht _GetGeschlecht; GetAlter _GetAlter; HINSTANCE hInstLibrary = ::LoadLibrary("CPP_DLL.dll"); if (hInstLibrary) { _GetName = (GetName)::GetProcAddress(hInstLibrary, "GetName"); _GetVorname = (GetVorname)::GetProcAddress(hInstLibrary, "GetVorname"); _GetGeschlecht = (GetGeschlecht)::GetProcAddress(hInstLibrary, "GetGeschlecht"); _GetAlter = (GetAlter)::GetProcAddress(hInstLibrary, "GetAlter"); if (_GetName) { std::cout << "DLL GetName Called " << std::endl; } FreeLibrary(hInstLibrary); } else { std::cout << "DLL Failed To Load!" << std::endl; } std::cin.get(); return 0; }Ist meine Vorgehen richtig?
-
Eher nicht.
Zum einen hast du den Header, über den du alle Definition der Klasse hast (Kannst also die Funktiondeklarationen weglassen), auserderm sind deine Funktionen, keine Freistehenden, sondern Member-Funktionen einer Klasse, daher glaub ich nicht, das du die so aufrufen könntest (Brauchst ja ein Objekt der Klasse).
Daher einfacheres Vorgehen:
- Erzeuge ein Konsolen-Projekt (hast du ja schon)
- kopiere deine .h, .lib, .dll in die naehe deines neuen Projektes
- Passe deine include- und lib-Pfad auf die vorher kopierten Dateien an
- Dann füge noch einen Verweis auf die DLL hinzu
- Includiere den Header in deiner "CPP_DLL_Test.cpp"
- Benutze das Klasse nun so als hättest du sie in diesem Projekt geschrieben
Mfg mdn
-
Marc-O schrieb:
Daher einfacheres Vorgehen:
- Erzeuge ein Konsolen-Projekt (hast du ja schon)
- kopiere deine .h, .lib, .dll in die naehe deines neuen Projektes
- Passe deine include- und lib-Pfad auf die vorher kopierten Dateien an
- Dann füge noch einen Verweis auf die DLL hinzu
- Includiere den Header in deiner "CPP_DLL_Test.cpp"
- Benutze das Klasse nun so als hättest du sie in diesem Projekt geschrieben
Mfg mdn
Dieses vorgehen bringt mir nicht viel, da ich eigentlcih keine Lib File verwenden möchte.
Ich möchte auch nicht den Headerfile verwende.Ich möchte nur der DLL File benutzen.
Ich habe einen Dummy Projekt(ausschliesslich C) erstellt, wo ich auch so vorgegangen bin:#include "stdafx.h" #include <iostream> #include <windows.h> typedef double (*AddFunc)(double,double); typedef double (*Subtract)(double,double); typedef double (*Multiply)(double,double); typedef double (*Divide)(double,double); int main() { AddFunc _AddFunc; Subtract _Subtract; Multiply _Multiply; Divide _Divide; HINSTANCE hInstLibrary = ::LoadLibrary("Dummy_DLL.dll"); if (hInstLibrary) { _AddFunc = (AddFunc)::GetProcAddress(hInstLibrary, "Add"); _Subtract = (Subtract)::GetProcAddress(hInstLibrary, "Subtract"); _Multiply = (Multiply)::GetProcAddress(hInstLibrary, "Multiply"); _Divide = (Divide)::GetProcAddress(hInstLibrary, "Divide"); if (_AddFunc) { std::cout << "23 + 43 = " << _AddFunc(23, 43) << std::endl; } if (_Subtract) { std::cout << "55 - 43 = " << _Subtract(55, 43) << std::endl; } if (_Multiply) { std::cout << "60 * 10 = " << _Multiply(60, 10) << std::endl; } if (_Divide) { std::cout << "300 / 50 = " << _Divide(300, 50) << std::endl; } FreeLibrary(hInstLibrary); } else { std::cout << "DLL Failed To Load!" << std::endl; } std::cin.get(); return 0; }
-
Niko_gast schrieb:
Dieses vorgehen bringt mir nicht viel, da ich eigentlcih keine Lib File verwenden möchte.
Warum war es dann ein Problem, dass keine Lib-Datei erstellt wurde?
Niko_gast schrieb:
Ich möchte auch nicht den Headerfile verwende.
Dann war das Gehampel mit der Umschaltung zwischen dllimport und dllexport unnötig.
Wenn du unbedingt über LoadLibrary/GetProcAddress gehen willst:
Erstens passen deine Funktions-Typedefs nicht zu den exportierten Methoden.
Zweitens passen die Namen der Symbole nicht. Schau dir mit dem Dependency Walker an, unter welchem Namen die DLL deine Methoden exportiert .
-
Dann sollten die Funktionen mittels
extern "C"deklariert werden (damit das C++ Name Mangeling abgestellt wird).
Und außerdem natürlich dann als freie (bzw. static Klassen-) Funktionen.
Aber welchen Sinn macht es, die DLL dynamisch per LoadLibrary zu laden (anstatt direkt dem Projekt hinzuzufügen)? Möchtest du ein Plugin-System verwenden?
-
MFK schrieb:
Niko_gast schrieb:
Dieses vorgehen bringt mir nicht viel, da ich eigentlcih keine Lib File verwenden möchte.
Warum war es dann ein Problem, dass keine Lib-Datei erstellt wurde?
Nein Lib ist schon erstellt wordenNiko_gast schrieb:
Ich möchte auch nicht den Headerfile verwende.
Dann war das Gehampel mit der Umschaltung zwischen dllimport und dllexport unnötig.
Wenn du unbedingt über LoadLibrary/GetProcAddress gehen willst:
1)Erstens passen deine Funktions-Typedefs nicht zu den exportierten Methoden.
2)Zweitens passen die Namen der Symbole nicht. Schau dir mit dem Dependency Walker an, unter welchem Namen die DLL deine Methoden exportiert .- warum nicht?
2)Ich habe schon geschaut und es stimmt.
- warum nicht?
-
Niko_gast schrieb:
- warum nicht?
Weil beispielsweise der Typ von Person::GetName nicht string()() ist, sondern string(Person::)().
Ist dir klar, dass du ein Person-Objekt brauchst, um GetName aufrufen zu können?
Niko_gast schrieb:
2)Ich habe schon geschaut und es stimmt.
Kann ich mir nicht vorstellen. Mit welchem Namen wird denn der Konstruktor exportiert?
-
@MFK
Ich habe meine code so angepasst:#include <Person.h> #include "stdafx.h" #include <string> #include <iostream> #include <windows.h> int main() { HINSTANCE hInstLibrary = ::LoadLibrary("CPP_DLL.dll"); if (hInstLibrary) { Person* p = new Person("hasdh","blala","M",31); if(p == NULL) { cout << "Objekt nicht geladen!"; getchar(); FreeLibrary(hInstLibrary); return 2; } cout << p->SagHallo() << endl; getchar(); FreeLibrary(hInstLibrary); } else { std::cout << "DLL Failed To Load!" << std::endl; } std::cin.get(); return 0; }es klappt leider nicht
was mache ich den falsch?
-
Was genau klappt denn nicht? gibt es einen Kompiler-Fehler bzw. Warnung?
Oder welche Ausgabe ist herausgekommen?Mfg mdn
-
folgende Fehlermeldungen :
error C2065: 'Person' : undeclared identifier
error C2065: 'p' : undeclared identifier
error C2061: syntax error : identifier 'Person'
error C2227: left of '->SagHallo' must point to class/struct/union/generic type
-
Fehler ist aufgehoben
#include "Person.h"

danke
-
Niko_gast schrieb:
Fehler ist aufgehoben
#include "Person.h"
Du verwendest jetzt Lib und Header. LoadLibrary kannst du dann auch weglassen.
-
MFK schrieb:
Niko_gast schrieb:
Fehler ist aufgehoben
#include "Person.h"
Du verwendest jetzt Lib und Header. LoadLibrary kannst du dann auch weglassen.
Mir ist leider nicht anderes aufgefallen
aber wenn ich dich frage wie kann ich den LoadLibrary benutzen ohne Header File
und Lib zu benutzendanke in voraus
-
Nur mit C-Funktionen. Für eine Klasse brauchst du den Header.