[Gelöst] DLL-Probleme



  • Kein Programmierer wird seine DLL Header mitgeben.
    Da kann ihn ja jeder in die Karten gucken.
    Wobei ich auch noch nie eine Header für die DLL's mitbekommen habe.
    Die Deklarationen sind aus der LIB zu erkennen.



  • Bei MS Compilern wird für die Benutzung einer DLL eine LIB- und eine H-Datei benötigt. (Punkt)

    Es sei denn Du benutzt die DLL via LoadLibrary/GetProcAddress



  • Ich bins mal wieder! 😉

    Hab jetzt den ganzen Kram in DLL's gepackt, Projekt mit den DLLs zusammengebastelt, und: NIX funktioniert!!

    So, jetzt mal wieder ruhig!
    Also DLL erstellen usw. klappt alles. Einbinden der Header usw. auch, meine Klassen und Namespaces sind meinem Projekt bekannt... Alles wunderbar. Allerdings bekomm ich dauernd den Linkerfehler LNK2028. Aus MSDN werd ich auch nicht schlau, da steht:

    Wenn eine systemeigene Funktion in ein reines Abbild importiert wird, unterscheiden sich die impliziten Aufrufkonventionen zwischen systemeigenen und reinen Kompilierungen.

    Ahja.... Kapier leider den Satz nicht!
    Das Beispiel dazu passt schon eher, weil ich eine Funktion in einem NAmespace habe, die ich ähnlich exportieren will:

    // LNK2028.cpp
    // compile with: /LD
    __declspec(dllexport) int func() {
       return 3;
    }
    

    Dabei steht noch, dass diese funktion implizit __cdecl ist. Was heisst das jetzt für mich? Muss ich meine Funktion in eine Klasse reinpacken? Muss ich die anders exportieren?? Wenn ja, wie? In der MSDN steht leider nicht dabei, wie man diesen Fehler behebt!

    Wär super, wenn mir nochmal jemand auf die Sprünge helfen könnte! Danke schon mal!



  • So, morgen zusammen!

    Hab mir die Fehlermeldungen heut nacht nochmal angeschaut und hab bemerkt, dass die Fehler immer bei ner Klasse auftreten, von der ich eine Instanz anlegen will in meinem Programm. Die Klasse ist noch unmanaged, im guten alten C++ geschrieben! 😉 Aber das sollte ja kein Problem darstellen, oder?
    Hier mal bissl Pseudo-Quellcode:

    namespace myNamespace{
    
    	class __declspec(dllexport) myClassName
    	{
    		public:
    			//Standardkonstruktor
    			myClassName(void);
    			// Standard-Destruktor
    			~myClassName(void);
                             ......
              }
    }
    

    In der schlauen MSDN steht drin, dass man somit alle public-Memberfunktionen der Klasse exportieren kann. Die erste Fehlermeldung meckert aber wegen meinem Konstruktor rum (sofern ich das aus der kryptischen Fehlermeldung richtig deute), nach ca. 10 Fehlern wegen Konstruktor/Destruktor kommen dann die Memberfunktionen dran (die alle public sind und wie oben exportiert werden).....
    Muss ich also die Memberfunktionen doch noch anders exportieren? Oder anders aufrufen (Aufruf für die Instanz im Programm eben über myNamespace::myClassName)?
    Bin langsam am Verzweifeln... Glaub ich nehm nen Strick und erschiess mich! 😉 😡
    Danke schon mal im Voraus!! Hoffe jemand hat nen Tipp für mich! 👍



  • Danke schon mal im Voraus!! Hoffe jemand hat nen Tipp für mich!

    Klar, immer wieder gerne. Poste Fehlermeldungen



  • Fehlermeldungen:

    173 mal die gleiche:

    Error 27 error LNK2028: unresolved token (0A000056) "public: void __thiscall NamespaceDLL::KlassennamenBasisklasse::MemberfunktionWertSetzen(double)" (?MemberfunktionWertSetzen@KlassennamenBasisklasse@NamespaceDLL@@$$FQAEXN@Z) referenced in function "private: void __clrcall NamespaceAnwendung::Form1::RegKartenEinlesen(class NamespaceDLL::KlassennameAbgeleitetKlasse* const)" (?RegKartenEinlesen@Form1@NamespaceAnwendung@@$$FA$AAMXQAVKlassennameAbgeleitetKlasse@NamespaceDLL@@@Z) Form1.obj

    Der Fehler kommt 173mal, mit so ziemlich allen Memberfunktionen meiner Klasse. Diese sind alle public und exportiert wie oben beschreben...

    Hab die DLL aus meinem Projekt wieder rausgenommen und nehme direkt die h und cpp-Files, da klappt es. Liegt also wohl an einer falschen Exportierung meiner Klasse/Memberfunktionen??



  • Hast Du die lib hinzugefügt ?



  • Knuddlbaer schrieb:

    Hast Du die lib hinzugefügt ?

    Hinzugefügt per Verweis oder in das Arbeitsverzeichnis kopiert??

    Derzeit liegt die noch im debug-Ordner, zuusammen mit der *.dll. HAbs nicht geschafft nen Verweis auf die zu erstellen, #using und #include geht auch nicht.
    Mein DLL-Projekt dagegen ist per Verweis hinzugefügt (so wie in der MSDN). Ist so die LIB dann doch nicht bekannt?

    Hier nochmal der Link: http://msdn2.microsoft.com/de-de/library/ms235636(VS.80).aspx
    Einzigen Schritt den ich nicht hinbekommen habe: Schritt 5 bei "So verwenden Sie Funktionen der Klassenbibliothek in der Konsolenanwendung" (die Sache mit dem PATH, allerdings hat das bei nem andren Projekt auch ohne geklappt)



  • Datei hinzufügen -> lib auswählen fertig



  • Knuddlbaer schrieb:

    Datei hinzufügen -> lib auswählen fertig

    Ist mir jetzt fast schon peinlich, aber ich frag trotzdem:
    Wo mach ich das? Unter "Verweise"? Oder im Menü Datei??? 😕 😕



  • OK, habs gefunden... Bin wohl manchmal zu ungeduldig! 😉

    Normalerweise wird doch die lib automatisch mit erstellt, oder? Weil bei mir macht er die lib nur, wenn ich das in den Projekteinstellungen explizit angebe..... Nervt bissl, das Ding immer zweimal zu kompilieren, wenn Änderungen vorgenommen wurden!

    Trotzdem allen ein Dankeschön! 👍


Anmelden zum Antworten