Problem beim Einbinden einer eigenen DLL
-
Hallo an alle da draußen,
Ich habe eine eigene DLL geschrieben, die ich auch soweit erfolgreich kompilieren und erstellen konnte. Nun habe ich aber ein großes Problem beim Importieren dieser DLL in meine Windows Andwendung.
Diese DLL beinhaltet einige Klassen, die ich zum Arbeiten in der Windows Anwendung benötige(Anwendung ist ein Win32 API Projekt ). Hier kurz ein der Klassendefinitionen der DLL//MyString.h #pragma once #include "stdafx.h" class __declspec(dllexport) MyString { public: //konstruktoren MyString(); MyString (const char * string) ; usw.Wie gesagt die DLL lässt sich erstellen, das scheint zu funktionieren, die Klasse sollte exportiert werden können.
Nun kurz der Anfangscode der Windows Anwendung
// TestDLL.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "TestDLL.h" #include "ErrorClass.h" #include "MyString.h" #include "RecordField.h" #include "ScimoreInterface.h" #include "StringArray.h" #define MAX_LOADSTRING 100 MyString TestString (TEXT("Test")); usw.Soweit spuckt der Compiler keinen Fehler aus. Ich kann eine Instanz der Klasse erstellen. Der Header, in der die Klasse MyString deklariert wird, wird auch inkludiert( anstatt __declspec(dllexport) steht an der betreffenden Stelle jetzt ein __declspec(dllimport)). Mit der Importbibliothek dürfte es auch keine Probleme geben, sie sollte ebenfalls inkludiert sein. Ich habe der Instanz schonmal mit dem Debugger hinterhergeschnüffelt, das Objekt wird korrekt initialisiert.
Doch wenn ich jetzt eine Elementfunktion der Instanz diesesr Klasse aufrufen möchte, dann lässt sich der code nicht mehr compilieren.// TestDLL.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "TestDLL.h" #include "ErrorClass.h" #include "MyString.h" #include "RecordField.h" #include "ScimoreInterface.h" #include "StringArray.h" #define MAX_LOADSTRING 100 MyString TestString (TEXT("Test")); TestString.GetString();Folgende Fehlermeldung erscheint ( GetString() ist 100% deklariert und implementiert ) :
1>d:\arbeit\c++ programmiertes\flugleiter manager\flugleitermanager\testdll\testdll.cpp(16) : error C2143: Syntaxfehler: Es fehlt ';' vor '.' 1>d:\arbeit\c++ programmiertes\flugleiter manager\flugleitermanager\testdll\testdll.cpp(16) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. 1>d:\arbeit\c++ programmiertes\flugleiter manager\flugleitermanager\testdll\testdll.cpp(16) : error C2371: 'TestString': Neudefinition; unterschiedliche Basistypen 1> d:\arbeit\c++ programmiertes\flugleiter manager\flugleitermanager\testdll\testdll.cpp(15): Siehe Deklaration von 'TestString'Der Compiler scheint mir also sagen zu wollen, dass er mein gerade instantiertes Objekt nicht mehr kennen will, denkt ich will ein neues Objekt erstellen und wirft mir dann vor, dass ich keinen Typenspezifizierer angegeben hätte und meckert, dass ich den Namen ja vorher schonmal vergeben habe.
Ok wo liegt jetzt das Problem ? Hört sich für mich an, dass irgendwelche Deklarationen in der Headerdatei nicht korrekt sind. Da ich diese Klasse aber schon umfassend debuggt habe, dürfte es daran eigentlich nicht liegen. Oder vielleicht doch, oder habe ich die Klasse nicht korrekt exportiert beim Erstellen der DLL ? Muss ich das __declspec(dllexport) auch bei der Implementation der Elementfunktionen anwenden? Ich habe keine Ahnung und würde mich freuen wenn ihr Rat wisst.
Grüße jackis
-
Die Frage wäre wohl im WinAPI-Forum besser aufgehoben...
-
MyString TestString (TEXT("Test")); TestString.GetString();Du kannst doch an dieser Stelle keine Funktionen aufrufen!
Edit:
Mit an dieser Stelle meine ich im cpp File irgendwo im Nirvana...
-
Danke nochmal für die Antworten, diese Dämlichkeit meinerseits, ist mir dann irgendwann den nächsten Tag auch aufgefallen. Ich muss ehrlicherweise sagen, dass ich das vorher gar nicht wusste, dass Funktionen nicht außerhalb von WinMain aufgerufen werden dürfen, ich bin aber auch noch nie darüber gestolpert, weil ich es schlichtweg nie ausprobiert habe. Nichtsdestotrotz, die DLL lässt sich natürlich einbinden und läuft auch wie gewollt
Schönen tag noch
jackis