C++ Klasse in DLL
-
Hallo,
Ich habe zwar schon etwas gesucht habe allerdings zu dem Thema nichts finden können. Ich denke allerdings dass ich unter den falschen Schlagworten gesucht habe. Vielleicht kann mir ja jemand auf die Sprünge helfen.
Also ich habe ein Klasse in C++ die mir die Kommunikation mit einer Kamera steuert. Das ganze soll jetzt in eine DLL gepackt werden. Hierbei sollen aber keine Objekte erzeugt werden, sondern nur eine handvoll ausgewählter funktionen nach aussen sichtbar sein.
Zum Beispiel:
init(int Port);
grab(int PictureQuantity);innerhalb der DLL soll beim init einfach ein globales Objekt angelegt werden, über dass dann bei Grab die bilder geholt werden.
Jetzt ist mein grosses Problem wie pack ich sowas in eine DLL? Ich habe auch schon rumprobiert, bin aber noch auf keinen grünen Zweig gekommen.
Ich verwende VS2003. Der Hintergrund von der ganzen angelegenheit ist, dass die DLL später von einem Kollegen ua. in Delphi eingebunden werden soll, damit dieser wiederum an die Bilder kommt.Ich hoffe ich konnte die Problematik einigermaßen klar darstellen.
*winke*
-
Was hast du denn bisher probiert? So schwierig ist das jetzt nicht, wenn man aber wüsste, wo deine Probleme sind, könnte man besser helfen.
gruß
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-214987.html
Siehe meine Kommentare.
Simon
-
http://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api6.htm
... falls der Umgang mit den DLL dein Problem sein sollte.
-
Hallo,
Danke schon mal für die Anworten hab dadurch schon mal einen besseren Einblick in die DLLs erhalten.
Hier mal etwas code was ich unter anderem schon versucht habe:
#ifdef ETHERNETCAMERADLL_EXPORTS #define ETHERNETCAMERADLL_API __declspec(dllexport) #else #define ETHERNETCAMERADLL_API __declspec(dllimport) #endif #include "CameraHandler.h" // -> Klasse die für die Kamerakommunikation zuständig ist #include <string> class ETHERNETCAMERADLL_API CEthernetCameraDLL { private: CCameraHandler *cam_Current; public: CEthernetCameraDLL(void); bool startCamera (int int_Channel, std::string str_PathToSave); bool stopCamera(); bool grabImages(unsigned char* pbt_Location, int int_Quantity); };Die start Funktion im cpp file
bool CEthernetCameraDLL::startCamera (int int_Channel, std::string str_PathToSave){ cam_Current = new CCameraHandler(int_Channel); if (cam_Current->init(str_PathToSave))return true; return false; }In der CameraHandler habe ich die ganzen Kamera Steuerungen oder zum Beispiel auch kleine Hilfsfunktionen die die Speicherverzeichnisse anlegen etc. Das erstellen der DLL klappt scheinbar auch schon.
Wenn ich jetzt die DLL in ein anderes Projekt rüberkopier, muss ich ja auch das Headerfile mit kopieren um die Funktionen bekannt zu machen. Da beschwert sich der Kompiler zu recht, dass die CameraHandler.h nicht gefunden wurde, die ja aber eigendlich schon in der DLL mit verpackt sein sollte. *kopfkratz* Irgendwo ist da noch ein kleineres Verständnissproblem von meiner Seite.
#include "stdafx.h" #include "./EthernetCameraDLL.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; }*winke*
-
Eine Forward-Deklaration sollte hier doch ausreichen.
// #include "CameraHandler.h" // -> Klasse die für die Kamerakommunikation zuständig ist class CCameraHandler; #include <string>Das #include verschiebst du in die Datei CameraHandler.cpp.
-
-
Danke,
Daran hatte ich gar nicht gedacht
Das kommt davon wenn man alle Nase lang mit einer anderen Programmiersprache arbeitet.Ich kann jetzt die DLL und das Programm beides kompilieren. Ich erhalte nur leider eine sehr kryptische Fehlermeldung zur Laufzeit:
"Unhandled exception at 0x7a0c8c7c in TestingTheDLL.exe: User breakpoint."
Das seltsame ist, dass dieser Fehler scheinbar auftritt bevor das Programm überhaupt korrekt startet. Wenn ich einen Brakepoint bei der cout anweisung setzte, komm ich nichtmal da hin.Um einen Fehler vorzubeugen. das lib und das h File hab ich zu den sources gelegt, das DLL dann zur exe (also in den Debug Ordner), ist das korrekt so?
#include "./EthernetCameraDLL.h" #include <iostream> int main(int argc, char* argv[]) { std::cout << "test"; CEthernetCameraDLL* cam = new CEthernetCameraDLL(); //cam->startCamera(0, "./imgs"); return 0; }*winke*
-
Also das Problem ist echt seltsam, wenn ich das Programm über VS starten will erhalte ich weiterhin die Fehlermeldung, wenn ich alles bis auf einen cout auskommentiere und da einen brakepoint hinsetzte läuft das Programm durch, halt aber am cout nicht an.
Wenn ich das ganze dann allerdings über Konsole starte, läufts problemlos durch. Sprich das mit der DLL klappt
Ich denke mal das ist irgendein VS spezifischen Problem, jemand eine Idee?
*winke*