MFC Applikation in DLL verpacken



  • Hallo,

    folgendes Szenario:
    Ich habe eine MFC Applikation (App1).
    Nun möchte ich das ganze in eine DLL verpacken - fragt nicht wieso, ist halt so gefordert.
    Von einer anderen MFC Applikation (App2) aus möchte ich nun die gesamte Logik und GUI der DLL -sprich der ursprünglichen App1 - verwenden.

    Wie am besten vorgehen?
    Bei App1 die gesamte Logik von main() rauskopieren in eine Funktion, welche ich über die DLL Schnittstelle aufrufen kann? Und halt die CWinApp an diese DLL Funktion übergeben, sodass die DLL dann alles weitere damit anstellen kann?
    Von App2 dann die DLL Funktion aufrufen, welche dann die gesamte Funktionalität, wie aus App1 bekannt, startet?

    Problem ist hauptsächlich, dass die CWinApp und viele ähnliche Dinge recht tief in App1 drinnen sind und es nicht so einfach ist, dies zu entwirren und stattdessen CWinApp von der aufrufenden App1 zu nehmen.

    Gibt es da eine bessere Vorgehensweise?


  • Mod

    Eine Standard DLL benötigt auch ein CWinApp Objekt.
    Da ist nicht viel auseinander zu basteln.

    Der Unterschied ist aber gravierend. InitInstance/ExitInstance kommt einem DllMain Aufruf gleich.

    Ansonsten ist die Anforderung eine EXE in eine DLL zu packen absoluter Unfug.
    Was soll denn bitte passieren, wen die DLL Funktion aufgerufen wird?
    Die Message Loop startet und der DLL Aufruf (Deine ehemalige EXE kommt) nicht zurück bis die EXE beendet wird. Ist das gewollt?

    Wenn Deine EXE sowieso wie ein Dialog funktioniert (oder gar Dialog-based ist kannst Du die Anwendung ja leicht umbauen.

    Hast Du viel Intelligenz in CWinApp?
    Wenn ja warum? 😉

    Ohne mehr über Deine Anwendung zu wissen kann man da wenig sagen.
    Man kann ja auch einen DLL Wrapper schreiben der per OLE-Automation mit Deiner App1 kommuniziert...



  • Das machst Du so,

    einfach die App nicht als EXE sondern als DLL (statisch) Kompilieren.

    DLL Main löschen auf der blanken Seite folgendes einsetzen:

    #include "stdafx.h"
    
    typedef class CVPTable
    {
    public:
    	CVPTable(){};
    	virtual ~CVPTable(){};
    	virtual bool Test(void){return 0;}
    }CVPTABLE;
    
    typedef class CMyClass : public CVPTable
    {
    public:
    	CMyClass();
    	~CMyClass();
    	bool Test(void)
             {
               return true;
             }
    }TST;
    
    class CLayerApp : public CWinApp, CMyClass
    {
    public:
    	CLuaLayerApp(){}
    	BOOL InitInstance();
           	DECLARE_MESSAGE_MAP()
    };
    
    BEGIN_MESSAGE_MAP(CLayerApp, CWinApp)
    END_MESSAGE_MAP()
    
    CLayerApp m_LayerApp;
    BOOL CLayerApp::InitInstance()
    {
      CWinApp::InitInstance();
      return TRUE;
    }
    
    //einzig veröffentliche Funktion gibt Zeiger auf MyClass 
    extern "C" __declspec( dllexport ) CMyClass *GetHand(void)
    {		
    	return (CMyClass *)&m_LayerApp;
    }
    

    Dynamisch Laden der Klasse

    HANDLE m_DllHand = LoadLibrary("MyDll.dll");
    typedef CMyClass *(* GETMYCLASS)(void);
    GETMYCLASS pFcGetMyClass((GETMYCLASS)GetProcAddress(m_DllHand,"GetHand"));
    pFcGetMyClass->Test();
    FreeLibrary(m_DllHand),m_DllHand = NULL;
    

Anmelden zum Antworten