CDialog::Create() in MFC- Erweiterungs- DLL ohne ParentWnd schlägt fehl



  • Hallo,

    ich habe eine MFC- Erweiterungs- DLL, die ich wahlweise aus einer MFC- App und einer WPF- Applikation aufrufe (...n will).
    Mit der MFC- App gibts kein Problem, denn da gibt ja ein Applikationsfenster, das auch automatisch als Parent- Wnd verwendet wird, wenn nichts explizit übergeben wird.
    Bei der .NET App ist das anders, hier habe ich kein Parent- Wnd (??) und Create() schlägt fehl. Eine erste Ursache konnte ich beheben, nämlich dass die Ressourcen nicht gefunden wurden.
    Das habe ich mit AfxSetResourceHandle(hInstance); in der DLLMain() gelöst.
    Jetzt liegt die Schwierigkeit an anderer Stelle:
    In der dlgcore.cpp kommt die Abfrage

    if (CreateDlgIndirect(lpDialogTemplate, CWnd::FromHandle(hWndParent), hInst))
    

    ...und hier ist hWndParent == 0x000000 - logisch.
    Wie Ihr vielleicht gemerkt habt, stecke ich an dieser Stelle fest. Ich brauche die DLL in beiden Welten. Ein sehr wichtige App ist und bleibt MFC. Ein neues sehr wichtiges Projekt wird definitiv WPF - .NET...
    Hat jemand eine Idee für mich, bzw Erfahrungen?
    Vielen Dank für Eure Hilfe!
    P.A.


  • Mod

    Extension DLLs kann man nicht ohne eine MFC Anwednung benutzen!
    Lies die Doku:
    http://msdn.microsoft.com/en-us/library/h5f7ck28(VS.90).aspx
    Du musst eine Standard DLL bauen.

    Das zweite Problemmit den Ressourcen ist auch klar dokumnetiert:
    AFX_MANAGE_STATE
    http://msdn.microsoft.com/de-de/library/ba9d5yh5(VS.80).aspx

    Siehe auch:
    http://blog.m-ri.de/index.php/2008/02/25/warum-man-manchmal-afx_manage_state-auch-in-seiner-eigenen-exe-aufrufen-muss/



  • Hallo Martin,
    auch wenn es sehr bitter ist, vielen Dank für Deine klare, helfende Antwort!
    Ich war sehr hoffnungsfroh, weil das "Wrappen" und Laden der (MFC-Erweiterungs-) DLL so prima funktioniert hat. Die Objekte liesen sich anlegen und darauf zugreifen, die DLL hat aus Ihrer *.ini- Datei gelesen und ich konnte auch (testweise) AfxMessageBoxes aufrufen. Nur die Dialoge wollten sich nicht anzeigen lassen, wobei die Initialisierungen funktioniert hatten. Nun ja, dann werden ich mir jetzt mal Gedanken machen müssen, wie ich das umbaue...
    Vielen Dank für Deine Hilfe und Deine hilfreichen Links.
    P.A.


  • Mod

    Als Hint:
    Ich habe es noch nie gemacht, aber Du könntest eine Standard DLL benutzen, die eine Extension-DLL lädt... Es kann sein, dass dies möglich ist. Lies mal die Technical Notes zu DLLs (TNs).



  • Hallo Martin,

    danke für den Hinweis. Das ist eine interessante Idee! Das zusammen mit dem Buch vom Prof. Scheibel (Visual C++.NET Kochbuch) mit seinem Kapitel 11 zu ReUse und Interop wird mir hoffentlich zu einer gängigen Lösung verhelfen. Dort lag auch mein Denkfehler, denn er hatte vom Wrappen einer Erweiterungs- DLL geschrieben (Kap. 11.17), aber im Beispiel dann den DLL Typ
    "Reguläre DLL, die eine öffentliche MFC-DLL verwendet" eingestellt. Seine Quellen konnte ich aber im VS2008 auch nicht erfolgreich ausführen. Das übersetzte Programm auf der CD lief allerdings. Er hat es aber mit Visual Studio 2003 geschrieben und konnte sich meine Probleme damit auch nicht erklären.
    Falls Du generell Interesse daran hättest (nicht primär meinetwegen), könnte ich Dir das Kapitel als PDF mailen.
    P.A.


Log in to reply