überladene DLL Funktionen dynamisch ansprechen?
-
Hallo
Wenn ich eine DLL Funktion dynamisch ansprechen will, brauche ich in VC6++ wohl ein .def File in der DLL wo die Funktion bekanntgegeben wird.
z.B.
; DlgPlugin3Dll.def : Declares the module parameters for the DLL. LIBRARY "DlgPlugin3Dll" DESCRIPTION 'DlgPlugin3Dll Windows Dynamic Link Library' EXPORTS ; Explicit exports can go here [b]TestDLL ShowDLL[/b]mit z.B.
__declspec(dllexport) LONG ShowDLL(CWnd* pParent);Offensichtlich sind in den Deklarationen vom def-File nicht die Parameter enthalten, auch im Suchen der Funktion der aufrufenden Instanz ist ja nur der Name, nicht aber die Parameterliste enthalten
z.B.
typedef LONG (*LPSHOWDLG)(CWnd*); LPSHOWDLG showfct = (LPSHOWDLG)::GetProcAddress(m_hDll3,"ShowDLL");Wie könnte ich nun eine überladene Funktion aus der DLL exportieren und in der aufrufenden Instanz auch finden (z.B. ShowDLL(void) ? Einfach die Namen durchnummerieren, so wie sie in der DLL hintereinander im Header definiert sind? Oder kann man die Paramter nach einem Schema dem Namen hinzufügen?
Danke
Stefan
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ein DEF-File brauchst Du nur, wenn der Name der Funktion etwas "schöner" sein soll...
PS: Es gibt keine "Überladene" Funktionen.... oder meinst Du welche mit unterschiedlichen Parametern?
Gib ihr einen anderen Namen!?
-
Das kann jetzt Entwicklungsumgebungsabhängig sein, aber in VC++ 6 habe ich tatsächlich nur eine Funktion per GetProcAdress finden können, wenn ein .def File in der DLL dabei war. Ansonsten war der Pointer auf die Funktion bzw. der return Wert gleich 0.
Und ja, es geht um unterschiedliche Parameter bei gleichem Funktionsnamen. Das man jede Funktion individuell benennen könnte wäre natürlich der logische Workaround falls die Antwort auf meine Frage "geht nicht" wäre :))
Ach ja, ich arbeite platformspezifisch, de facto nur VC++. Darf also ruhig speziell sein
Gruß
Stefan
-
Eine DLL kann AFAIK nicht 2 (oder mehr) Exporte mit dem gleichen Namen haben. Und selbst WENN könnte man sie nichtmehr namentlich mit GetProcAddress ansprechen.
Die Namen sind aber eigentlich vollkommen egal sobald man GetProcAddress verwendet -- ist doch ziemlich wurscht was für einen String man da übergibt, und ob das 3x der gleiche String für 3 Funktionen (mit unterschiedlichen Parametern) ist oder 3 unterschiedliche.
Ich mache es normal einfach immer so dass ich eine Funktion exportiere welche einen Zeiger auf eine abstrakte C++ Klasse ("Interface") zurückliefert. Im einfachsten Fall sieht das so aus:
// .hpp: class Foo { public: virtual void Blubb() = 0; virtual void Blubb(int a) = 0; virtual int Blubb(std::string const& a) = 0; // ... }; // .cpp: class FooImpl : public Foo { // ... }; extern "C" __declspec(dllexport) Foo* GetFoo() { static FooImpl f; return &f; }Dann holst du dir einfach nurmehr einen Zeiger auf GetFoo, der Rest geht über das "Interface".
-
Und wie ist die Reihenfolge der Strings im .def File definiert relativ zu der Definition in Interfacedateien? Insbesonders wenn Funktionen in verschiedenen Interface-Dateien definiert sein sollten (unschön, ich weiß, aber jetzt rein prinzipiell gesehen).
Gruß
Stefan
-
Stefan_L_01 schrieb:
Und wie ist die Reihenfolge der Strings im .def File definiert relativ zu der Definition in Interfacedateien? Insbesonders wenn Funktionen in verschiedenen Interface-Dateien definiert sein sollten (unschön, ich weiß, aber jetzt rein prinzipiell gesehen).
Ich verstehe den 1. Satz nicht.
Was für Reihenfolge von irgendwas?
Du brauchst garkein .def File.