Und eine letzte Frage zu DLLs ;)
-
So, nachdem ich mich jetzt durch jeden Beitrag zum Thema Klassen in DLLs hier im Forum durchgegraben hab, bin ich zu dem Schluss gekommen, dass man das nicht machen sollte

Allerdings hab ich beim Lesen eines Tutorials eine DLL erstellt, in der ein struct __declspec(dllexport) Struktur verwendet wird, das nur einen int Wert besitzt.
Mein Hauptprogramm verwendet die DLL, hat jedoch deren Header nicht zu Verfügung, kennt also die Deklaration von Struktur nicht. Gibt es nun entgegen allen Empfehlungen und Standards eine Möglichkeit, in meinem Hauptprogramm, das die DLL dynamisch laden soll, die Struktur "bekannt zu machen", ohne den Header oder ohne eine neue Deklaration zu schreiben?
Ich hab da was gelesen, dass man in der DLL eine Funktion schreibt, die solch ein Objekt erstellt, und es dann als Instanz weitergibt (???)
Wäre nett, wenn mir das jemand erklären könnte, falls das überhaupt mit meinem Problem zu tun hat
greets
-
Du sprichst wahrscheinlich von COM-Programmierung. Dabei erstellst du Komponenten DLL/EXE in einer Art und Weise das auf Client-Anforderung hin, Instanzen von Objekten erzeugt und an den Client zurückgeliefert werden.
Es gibt im wesentlichen 3 Vorgehensweisen zur Erstellung durch Visual C++:
1.) MFC
2.) ATL
3.) "von Hand"
Alle 3 Methoden erfordern einiges Wissen, insbesondere Methode 3. Sowohl mit MFC als auch mit ATL wirst du durch verschiedene Wizards unterstützt. Im Blindflug, d.h. ohne das du den Background kennst, würde ich dir aber auch diese einfacherern Methoden nicht empfehlen.Nachfolgend die besten Buchempfehlungen:
http://www.amazon.de/exec/obidos/ASIN/1572313498/qid=1093701811/sr=1-4/ref=sr_1_10_4/302-0121747-7368024
http://www.amazon.de/exec/obidos/ASIN/0201634465/qid=1093701880/sr=1-1/ref=sr_1_10_1/302-0121747-7368024
http://www.amazon.de/exec/obidos/ASIN/3860634593/qid=1093701992/sr=1-2/ref=sr_1_26_2/302-0121747-7368024mfg JJ
-
du willst also aus einer dll ein struct laden, ohne dass du weisst was des is?
da aber dein programm nicht weiss was es ist kanns doch auch nix mit den daten der dll machenam besten sagst du einfach was du im endeffekt machen/erreichen willst
ausserdem bitte definiere "bekannt zu machen"

-
Mit bekannt zu machen meine ich deklarieren
Ich bring nur ab und zu solche Begriffe ein bisschen durcheinander 
Also ganz einfach sieht der Header in der DLL so aus:
#ifdef __cplusplus extern "C" { #endif struct __declspec(dllexport) Struktur { int Wert; } __declspec(dllexport) int GetWert(Struktur); #ifdef __cplusplus } #endifDie .cpp Datei der DLL:
#include "testdll.h" __declspec(dllexport) int GetWert(Struktur S) { return S.Wert; }Ich geh nun davon aus, dass ich ein Programm, das diese DLL benötigt, auf einem anderen Rechner ausgeführt werden soll. Dort hab ich dann aber nicht den passenden Header (ich geh einfach mal davon aus, dass ich den Header nicht habe, will also nur schauen, ob das Problem so lösbar ist). In diesem Hauptprogramm will ich die Funktion GetWert benutzen, laden kann ich diese ja so:
#include <windows.h> typedef int (* pfnGet)(Struktur); // hier gibts logischerweise nen Fehler int main() { HMODULE hDll = LoadLibrary("testdll.dll"); pfnGet GetWert = (pfnGet)GetProcAddress(hDll, "GetWert"); . . . return 0; }Meine Frage ist nun, ob es die Möglichkeit gibt, dass er sich die Deklaration von Struktur quasi aus der DLL nimmt (Struktur kann ja auch eine Klasse sein), also ohne dass ich einen Header einbinde. Denn wenn ich von jemandem eine in C++ geschriebene DLL mit Funktionen oder Klassen bekomme, hab ich ja auch keinen passenden Header.
Es läuft also auf die Frage zur Exportierung von Klassen heraus (denke ich
)
Ich will einfach die DLL ohne Header verwenden und die Strukt-/Klassendeklaration nicht neu schreiben in meiner cpp Datei. Mir würde da so etwas wie GetClassAddress oder so vorschweben, aber das gibts wohl nicht
Denn im Moment kommen ja logischerweise überall Fehler, wo ich Struktur im Hauptprogramm verwende, da er sie ja nicht kennt.
Falls das aber nicht geht, frage ich mich, wieso im Tutorial (oder auch wenn man bei DLL in MVC auf ein paar Symbole exportieren klickt) die Struktur bzw. die Klasse mit __declspec(dllexport) deklariert wird.Hoffe ich konnte mich ein bisschen verständlicher ausdrücken ...

-
Ich weiss nicht ob du meinen Beitrag gelesen hast. Aber das was (möglicherweise !?) suchst ist Introspektion wie es sie beispielsweise bei Java gibt. Das heisst, zur Laufzeit die Fähigkeiten einer Klasse ermitteln, ohne die Nutzung "externer" Informationen.
Mittels COM ist sowas auch in C++ zu realisieren. Genau diesen Zweck hat das IDispatch-Interface. Die Nutzung diese Features sieht man in den Eigenschaftsdialogen von "vb"-artigen Entwicklungsumgebungen.mfg JJ
-
Denn wenn ich von jemandem eine in C++ geschriebene DLL mit Funktionen oder Klassen bekomme, hab ich ja auch keinen passenden Header.
doch in der regel liefert jede dll/lib passende header mit
-
@John: Ja ich hab deinen Beitrag gelesen

Allerdings gab es auf ähnliche Frage immer eine kürzere Antwort, worauf dann jeder gesagt hat "OK so mach ichs Danke"
Und da war nie von COM die Rede, aber davon hab ich ja auch keine Ahnung ...
Ich muss jetzt zwar schnell off, such aber morgen früh mal einen Thread heraus, wo es so beschrieben ist