MFC Dlls



  • Hi!

    Meine Gui, die ich mühseelig mit Hilfe der MFC erstellt habe ;), soll mit einer (oder später vllt. auch mit mehreren)
    Dll gefüttert werden.

    Als ich gestern Abend eine Test-Dll erstellen wollte, waren mir ein paar Dinge unklar:
    Zunächst gibt es die Möglichkeit mit dem Visual Studio unter dem Menü-Punkt:

    1. MFC - MFC-DLL
    2. Win32 - Create Project -> Add common header files for MFC

    eine DLL mit MFC unterstützung zu erstellen. Worin liegt der Unterschied, bzw. welche ist bevorzugt zu verwenden?

    Die zweite Frage ist, ist es überhaupt gut MFC Klassen in DLLs einzusetzen? Ich würde sagen dass man beispielsweise
    ein CArray nur für interne Funktionen verwenden sollte, jedoch nicht als Übergabe- oder Rückgabeparameter einer zu
    exportierenden Funktion. Liege ich mit meiner Meinung richtig, oder ist das prinzipiell nichts gegen einzuwenden?

    Also erstmal Danke und Lg
    Kerberos



  • Wenn du MFC-Methoden exportieren willst, dann können diese auch nur von MFC-Anwendungen benutzt werden. Deshalb ist es wohl meist sinnvoller, intern ruhig MFC-Klassen zu verwenden, jedoch nur C-Funktionen zu exportieren.


  • Mod

    Es ist gängige Praxis Extension DLLs und regular DLLs mit der MFC zusammen zu erzeugen.
    Wichtig:
    1. Du musst die MFC als Shared-Library verwenden.
    2. Alle Module müssen mit dem gleichen COmpiler und den selben MFC Headerern und Libs kompiliert werden!

    Wir benutzen große FC-DLLs wie zum Beispoiel die BCG-Lib und andere Extension DLLs aus eigenem Bau...



  • Hi,

    erstmal ein Dankeschön für eure Antworten!

    Also kann ich eine reguläre MFC Dll später auch z. B. in C# verwenden, wenn ich ausschließlich C-Funktionen exportiere?

    LG und DANKE
    Kerberos


  • Mod

    Jupp!
    Aber dann könntest Du auch COM verwenden.



  • Hi,

    jetzt hab ich nochmal eine Frage:

    Für meine Aufgabe ist es evtl. vorteilhaft wenn ich Klassen für die zu exportierenden DLL-Funktionen verwenden könnte.
    So etwa wie bei einer Managed C++ DLL.

    Ich habe mal ein kleines Beispiel erstellt. Die Klasse Mensch wird in einer DLL definiert:

    class Mensch
    {
    private:
    	CString Vorname;
       CString Nachname;
    
    public:
    	CString GetName();
    };
    
    CString Mensch::GetName()
    {
    	return Vorname + Nachname;
    }
    

    Jetzt möchte ich in einem Projekt die Klasse Mensch einsetzen, ist das irgendwie möglich (weil ich ja die MFC-Klasse CString verwende)?

    In meinem Buch ist das, wie auch viel anderes, sehr mager beschrieben.

    Danke und Lg
    Kerberos


  • Mod

    Du kannst CString nur verwenden, wenn Du die die bereits erwähnten Regeln beherzigst, die ich Dir gegeben habe. CRT als DLL sowie MFC als DLL etc...

    Mit Managed C++ hat das aber nichts zu tun.



  • Hi Martin,

    danke für deine Unterstützung!

    Mit Managed Code hat das nichts zu tun, wollte lediglich sagen, dass ich es gerne so machen würde, wie es auch
    dort gemacht wird.

    Vielleicht habe ich meine Frage etwas falsch gestellt. Aber ich habe mich jetzt entschieden eine Erweiterungs-DLL
    zu erstellen, die die zu erstellende DLL ausschließlich in einem MFC Projekt verwendung findet.

    Hab das Ganze beispielhaft Implementiert und bin auf einen seltsamen Fehler gestoßen:

    In der Erweiterungs-DLL:

    class AFX_EXT_CLASS CMensch : CObject
    {
    
    public:
       CString m_strVorname;
       CString m_strNachname;
    
       CMensch();
    
    };
    
    CMensch::CMensch()
    {
       m_strVorname  = _T("Paul");
       m_strNachname = _T("Puppenspieler"); 
    }
    

    Im Beispielprojekt

    CMensch Mensch;
    AfxMessageBox(Mensch.m_strVorname);
    

    In der MessageBox wird lediglich ein "P" anzezeigt, mehr nicht. Woran liegt das?

    Lg und Danke
    Kerberos


  • Mod

    Hier wird es eben schon wieder schwierig. CString ist in einem MBCS Pojekt eben in char[] und in enem Unicode Projekt ein wchar_t.

    Entweder:
    1. In allen Projekten gleiche Unicode/MBCS Einstellungen verwenden.
    2. Explizit in den exportierten Klaseen CStringA oder CStringW verwenden.

    Ich würde zu 1. tendieren!



  • Hi Martin,

    und nochmals vielen Dank für deine hilfreiche Antwort! Die Projekte sind tatsächlich unterschiedlich
    eingestellt, warum auch immer!?

    Das ist eine Sache, in der ich mir bisher noch nicht ganz sicher war. Was wird denn standardmäßig verwendet,
    und was ist "Multi-Byte Character Set" -> ASCII?

    Wenn wir gerade dabei sind, wann wird _T("Text"); eingesetzt?

    Lg und Danke
    Kerberos


  • Mod

    Da man auf Windows 9x pfeifen kann, würde ich nur noch Unicode verwenden.

    _T sorgt dafür dass eine Stringkonstante automatisch in Unicode oder MBCS Codierung in den Coide übernommen wird.
    _T("Test") -> bei MBCS wird zu -> "Test"
    _T("Test") -> bei Unicode wird zu -> L"Test"

    Wenn man konsequent auch die _t Funktionen verwendet kann man das Programm einfach zwischen Unicode und MBCS umschalten und neu kompilieren.



  • Nochmal vielen Dank, Martin.
    Hast mir (wieder einmal) weitergeholfen.

    Lg
    Kerberos


Anmelden zum Antworten