Ist Objektorientiert Programmieren in Dlls möglich?
-
Ich rufe eine Funktion auf die auf ein, in der Dll als Global definiertes,
Objekt zugreift das vorher von einer anderen Funktion in der Dll Initialisiert wurde.
also so:void DllExport StartQuotation(string sInput, int iInput){ *RunQout = new Quotation(); //sInput,iInput RunQout->SetData(sInput,iInput); QuotIsInit= true; cout << RunQout->getData(); } string DllExport GetQuotFromObj(string Name, int QuotNr){ if (QuotIsInit) { return RunQout->GiveText(QuotNr); } else { return "Error\n" } }
Edit:
Leider gibt er beim kompilieren Fehler aus: wo nach im Objekt definierte Variablen nicht deklariert sind.
-
Mojo.Zache schrieb:
Leider gibt er beim kompilieren Fehler aus: wo nach im Objekt definierte Variablen nicht deklariert sind.
Äh ja. Schreib bitte mal die genaue Fehlermeldung, nicht deine Interpretation.
-
Sorry....
nocheinedll\quotation.cpp(66) : error C2065: 'i_Number' : undeclared identifier
-
Mojo.Zache schrieb:
Sorry....
nocheinedll\quotation.cpp(66) : error C2065: 'i_Number' : undeclared identifier
Ja, der Code dazu wäre wohl auch hilfreich
-
oops ... brauche wohl noch mehr kaffee...
Quotation.cpp
#include "StdAfx.h" #include "Quotation.h" Quotation::Quotation(void) { m_Name="Niemand"; i_Number=0; } Quotation::~Quotation(void) { } bool Quotation::SetData(string Name, int Number) { i_Number= Number; m_Name= Name; return false; } string GiveText(int Number){ string sWorking, s_text; //sWorking = m_Name; sWorking = "Name"; switch (Number) { case (1): s_text= "Qoute 1\n"; break; case (2): s_text= "Qoute 2\n"; break; case (3): s_text= "Qoute 3\n"; break; default: s_text= "Qoute def.\n"; break; } sWorking += "sagt: "; sWorking += s_text; return sWorking; } int GetData(){ return i_Number; }
Quotation.h
#pragma once class Quotation { public: Quotation(void); virtual ~Quotation(void); // Quotation(string Name, int Number); private: int i_Number; int i_quotelot; string GiveText(int Number); int GetData(); public: string m_Name; bool SetData(string Name, int Number); };
-
string Quotation::GiveText(int Number) { string sWorking, s_text; //sWorking = m_Name; sWorking = "Name"; switch (Number) { case (1): s_text= "Qoute 1\n"; break; case (2): s_text= "Qoute 2\n"; break; case (3): s_text= "Qoute 3\n"; break; default: s_text= "Qoute def.\n"; break; } sWorking += "sagt: "; sWorking += s_text; return sWorking; } int Quotation::GetData(){ return i_Number; }
-
Ok ein grober Fehler…
Leider behebt er das Problem an sich nicht.
Um genau zu sein gibt er einen Fehler aus den ich gar nicht zu ordnen kann.nocheinedll\dllmain.cpp(75) : error C2100: illegal indirection
Was in der Zeile mit dem Konstruktor Aufruf angegeben wird.
-
Dann mach mal den Stern da weg.
-
So einfach ist es nicht OO in C++ über DLL-Grenzen zu verwenden. Da ich derzeit noch in einer gemischten Compilerumgebung arbeite (was das ganze Unmöglich macht), liegt es etwas zurück das ich mich hiermit auseinander gesetzt habe.
Da ich in Kürze aber wieder in einer einheitlichen Compilerumgebung arbeite, würde mich tatsächlich mal interessieren was man nun alles beachten muss, damit man mit Klassen über DLL-Schnittstellen arbeiten kann (Wie gesagt: Identischer Compiler).
Mit MSVC musst du überall die DLL Runtime verwenden, und immer alles neu übersetzen, dann gibt's eigentlich keine Probleme mehr.
Wenn du nicht neu übersetzen willst, dann musst du die Header-Files konstant halten (PIMPL/compilation firewall), dann kann eigentlich auch nixmehr passieren.Und verwenden kannst du dann wirklich alles, also Exceptions werfen und fangen, RTTI, ... alles halt.
-
Das war es!
Super. Jetzt funktioniert der Aufruf auch endlich!
Und das bedeutet auch da ich in meiner Dll auch mein OO Entwurfsmuster umsetzten kann.
Danke an alle die mir geholfen haben.
Werde aber in Zukunft erst Wach werden und dann erst ins Forum Posten…
auf das ich euch nicht mit so trivialen Problemen nerve…