MFC-Dialog in C#-Anwendung

11/09/2008 - 09:38 von Marc Weichhold | Report spam
Hallo NG.

Ich hoffe, ich bin hier in der richtigen NG mit meinem Problem.

Ich habe die Aufgabe, einen MFC-Dialog (der in einer DLL steckt) in einer
C#-Anwendung anzuzeigen. Ich habe dazu folgende Schritte unternommen.

1. Managed C++-Wrapper für den MFC-Dialog in der DLL geschrieben.
2. DLL als Verweis in C#-Anwendung eingebunden.
3. Managed C++-Wrapper erzeugt und Dialog angezeigt.

Das Ganze funktioniert dann, wenn ich in der Wrapper-Klasse folgenden Code
ausführe:

void CMyWrapper::ShowMFCDialog()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyMFCDialog* pDlg = new CMyMFCDialog();
pDlg->DoModal();
}

Wenn ich jetzt in C# also eine Instanz von CMyWrapper erzeuge und die
Methode ShowMFCDialog aufrufe, funktioniert das Ganze wunderbar.

Sinn der Sache sollte es aber sein, dass der Wrapper eine Instanz des
MFC-Dialogs als Member-Variable enthàlt:

public ref class CMyWrapper
{
public:
CMyWrapper();
virtual ~CMyWrapper();
void ShowMFCDialog();
protected:
CMyMFCDialog* m_pDlg;
};

CMyWrapper::CMyWrapper()
{
m_pDlg = new CMyMFCDialog();
}

CMyWrapper::~CMyWrapper()
{
if(m_pDlg)
{
delete m_pDlg;
m_pDlg = NULL;
}
}

void CMyWrapper::ShowMFCDialog()
{
if(!m_pDlg)
{
return;
}
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_pDlg->DoModal();
}

Erzeuge ich jetzt in C# eine Instanz der Wrapper-Klasse und rufe die Methode
ShowMFCDialog auf, erhalte ich eine Assertion failed-Nachricht und der
MFC-Dialog wird nicht angezeigt.

Ich habe übrigens auch schon versucht, das AFX_MANAGE_STATE-Makro in den
Konstruktor der Wrapper-Klasse vor die Erzeugung des MFC-Dialogs zu
schreiben, das Ergebnis bleibt aber dasselbe: Assertion failed und keine
Anzeige des MFC-Dialogs.

Kann mir jemand erklàren, warum das Ganze im ersten Fall funktioniert und im
zweiten Fall nicht und was ich àndern muss, damit es im zweiten Fall auch
klappt?

Danke!

Marc
 

Lesen sie die antworten

#1 Thomas Scheidegger
11/09/2008 - 11:36 | Warnen spam
Hallo Marc

Ich hoffe, ich bin hier in der richtigen NG mit meinem Problem.



ich denke das Problem liegt nicht in C#
sondern C++ (C++/CLI, MFC), also im Prinzip NG:
microsoft.public.de.german.entwickler.dotnet.vc
(wobei kaum frequentiert)

MFC-Dialog in einer C#-Anwendung



naja, würde ich nur in letzter Not/Verzweiflung machen.


Assertion failed-Nachricht



es dürfte recht entscheidend sein, welche (C++) Assertion genau auftritt.
(ggf ist es fürs debuggen besser,
die DLL in einer pure-ManagedC++ App zu referenzieren, nicht C#)

Und das ganze sollte mal schon nur im einzigen GUI (STA) Thread ablaufen,
also ohne Worker/Pool-Threads oà.

Ursache liegt aber vermutlich eher an den üblichen Leiden
von CRT/MFC-Runtime Varianten (dyn/stat/MT...)
oder Versionen und deren Initialisierung (Zeitpunkt, Locker).


Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen