Kommunikation zwischen 2 DLLs?



  • Hi,

    ich habe folgendes Problem und bin mir nicht sicher wie ich das lösen könnte:
    Wie kann ich von einer DLL aus eine MFC-Anwendung, die in einer anderen DLL untergebracht ist, starten UND zwischen den beiden kommunizieren? Geht das überhaupt? Hab mit Dlls nicht sooo viel Erfahrung.

    Der Hintergrund, falls das hilft, ist folgender:
    Ich habe eine Software für die ich über ein SDK Plug-Ins schreibe. Die Plug-Ins werden in Form einer Dll eingebunden. Das kann jede Art von Dll sein, auch ein ActiveX-Objekt, da die Software ein ActiveX-Client ist. Nun möchte ich zur Ausgabe von Debbuging-Information meiner Plug-Ins eine kleine Anwendung (eigentlich nur ein schreibgeschütztes CEdit-Control) einbinden, die nur die cout-streams meines Plug-Ins ausgibt. Ich würde gerne dieses Ausgabefenster als eigene Dll einbinden, um sie in anderen Plug-Ins auch nutzen zu können ohne jedesmal den Code in das neue Projekt zu pasten. Mein Problem ist nun eben WIE starte ich diese Anwendung von meiner Plug-In DLL aus und WIE halte ich von dort aus eine Verbindung zu meinem Ausgabefenster aufrecht?

    Ich hoffe Ihr könnt euch ungefähr vorstellen worauf ich raus will. Wenn nicht, sagts mir einfach. Ich bin über jeden Lösungsvorschlag bzw. auch komplett neuen Lösungsweg offen 🙂

    Danke schonmal
    MJ

    PS.: Wie man eine cout-Stream an ein CEdit-Control umleitet, weiß ich ungefähr. Da gibts eine Lösung auf codeproject.com. Mir gehts bloß um die Kommunikation zwischen den beiden DLLs.



  • habe ein ähnliches problem:

    das dbms SQLite liegt in form einer dll vor. die lib habe ich erstellt und kann SQLite auch in meine anwendung einfügen (über die linkereinstellungen und die headerdatei).

    bloss möchte ich einige methoden erstellen, die mich an mysql+php erinnern sollen. ein versuch diese schnittstelle in einer dll zu kapseln schlug leider fehl, da ich noch nicht sehr viel erfahrung mit dlls habe.
    momentan habe ich dazu einfach eine klasse in meinem projekt erstellt.

    allerdings informiere ich mich momentan auch wie ich es machen könnte.

    also eine dll in einer dll anbinden.



  • hmm...sieht so aus als könnte uns hier leider keiner helfen.
    aber wenn du mal irgendeinen Lösungsansatz hast, dann wär ich dir dankbar wenn du mir ihn erklären würdest. bin nämlich immer noch nicht weiter gekommen 😞



  • Servus,
    Was macht ihr beide denn? Schreibt ihr eine Dll die mit einer anderen Dll kommunizieren soll oder schreibt ihr ein Prog indem die beiden Dlls Rückgabewerte von Funk haben und diese vergleichen wollt???

    *winke*
    Hellsgore



  • Hi
    ich habs auch nicht ganz verstanden, aber mal soviel kann ich sagen.

    Dein Plug-In (das die anderen Plug-Ins aufruft) hat ja eine Start-Funktion (wieauchimmer die heißen mag).
    In dieser Funktion gehst du einfach alle dll-Datein die sich in deinem "Plug-In Plug-In" Verzeichnis befinden durch und lädst sie mit LoadLibrary in den Speicher deines "Plug-Ins" (das du mit dem SDK erstellst).

    Die Plug-Ins zu deinem Plug-In müssen verschiedene Funktionen exportieren wie z.B. PluginStart PluginStop PluginSendEvent (sind meine Vorschläge, bitte nicht in der msdn dannach suchen :D) usw.
    Zeiger auf diese Funktion bekommst du einfach über GetProcAddress.

    Eine "Verbindung" zum Hauptfenster kannst du den Plug-Ins gewährleisten, indem du sie eine Funktion exportieren lässt, die einen Zeiger auf dein Hauptfenster übernehmen.

    Ich hoffe ich hab dich nicht total missverstanden 😃

    Grüße Rapha



  • Um das von Rapha noch zu kompletieren denn ich habe das auch so verstanden wie er gibs nen kleines Beispiel mit GetProcAdress:

    static HINSTANCE hinstDLL;
    typedef long (STDAPICALLTYPE *pDeinDllFunk)(byte byVarWennEsEineHat, etc.); 
    pDeinDllFunk DeinDllFunk;
    
    hinstDLL = LoadLibrary((LPCTSTR) "DeineDll.dll"); 
    if(hinstDLL != NULL)
    {
    DeinDllFunk = (Calculate)GetProcAddress(hinstDLL, "NameDerFunk"); 
    //Die Funk gib jetzt in meinem Beispiel einen CString zurück
    CString strRückgabe = DeinDllFunk(byte byVarWennEsEineHat, etc.);
    }
    

    und so geht das als Beispiel nur genommen...
    *winke*
    Hellsgore



  • danke erstmal für eure antworten...
    ja so ungefähr hab ich das gemeint. ich gebe zu, dass mein beispiel vielleicht etwas umständlich ausgedrückt war, aber ihr habts ja trotzdem verstanden 🙂

    also, ich werd das mal ausprobieren und wenn's nicht klappt, meld ich mich wieder 🙂

    grüsse, MJ


Log in to reply