Forum: PC-Programmierung Compilerfehler bei Controls (MFC - ATL Unverträglichkeit ?)


von Reinhard R. (reinhardr)


Lesenswert?

Hallo,

ich versuche gerade ein altes Projekt, eine DLL die sowohl ATL als auch 
MFC verwendet, um ein Ultimate Grid 
(http://www.codeproject.com/KB/MFC/UltimateGrid.aspx) zu erweitern. 
Weiters wird der "atlcontrols.h" Wrapper verwendet. Ich arbeite dabei 
mit VC++ 2005.

Das funktioniert jedoch nicht und bei meinen Recherchen bin ich bis 
jetzt auf keine Lösung gestoßen. Das Ultimate Grid (und auch ein paar 
verwandte Komponenten) verwendet ein paar MFC Klassen. Die "findet" der 
Compiler jedoch nicht. Die problematischen Codezeilen, inkl. der 
resultierenden Fehler sehen so aus. Folgefehler die beim Versuch auf das 
Objekt zuzugreifen entstehen, habe ich dabei ausgeblendet:
1
CToolTipCtrl m_ttc;
2
//1>d:\XXX\ug\edit controls\OXEdit.h(499) : error C2079: 'COXEdit::m_ttc' verwendet undefiniertes class 'CToolTipCtrl'
3
4
inline CToolTipCtrl* GetToolTip() { return &m_ttc; }
5
//1>d:\XXX\ug\edit controls\OXEdit.h(279) : error C2440: 'return': 'int *' kann nicht in 'CToolTipCtrl *' konvertiert werden
6
7
8
CToolInfo toolInfo;
9
//1>.\UG\Edit Controls\OXEdit.cpp(241) : error C2065: 'CToolInfo': nichtdeklarierter Bezeichner
10
//1>.\UG\Edit Controls\OXEdit.cpp(241) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'toolInfo'
11
//1>.\UG\Edit Controls\OXEdit.cpp(241) : error C2065: 'toolInfo': nichtdeklarierter Bezeichner
12
13
14
CImageList  m_leftImages;
15
//1>d:\XXX\ug\celltypes\UGCTMail.h(96) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_leftImages'
16
//1>d:\XXX\ug\celltypes\UGCTMail.h(96) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
17
//1>d:\XXX\ug\celltypes\UGCTMail.h(96) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
18
//1>d:\XXX\ug\celltypes\UGCTMail.h(97) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_rightImages'
19
//1>d:\XXX\ug\celltypes\UGCTMail.h(97) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
20
//1>d:\XXX\ug\celltypes\UGCTMail.h(97) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
21
//1>.\UG\CellTypes\UGCTMail.cpp(67) : error C2065: 'm_leftImages': nichtdeklarierter Bezeichner
22
//1>.\UG\CellTypes\UGCTMail.cpp(67) : error C2228: Links von ".Create" muss sich eine Klasse/Struktur/Union befinden.

Diese Fehler lassen sich beheben indem man explizit den "ATLControls" 
namespace angibt. Damit verlagert sich das Problem aber nur, weil dann 
Folgefehler auftreten weil die ATL Controls nicht die gleichen 
Funktionen unterstützen wie die MFC Variante. Das sieht dann z.B. so 
aus:
1
ATLControls::CToolTipCtrl m_ttc;
2
...
3
if(::IsWindow(m_ttc.GetSafeHwnd())){...}
4
//1>.\UG\Edit Controls\OXEdit.cpp(152) : error C2039: 'GetSafeHwnd': Ist kein Element von 'ATLControls::CToolTipCtrlT<Base>'
5
//1>        with
6
//1>        [
7
//1>            Base=ATL::CWindow
8
//1>        ]

Meine Frage ist jetzt, wie kann ich dem Compiler klar machen dass der 
die MFC Controls verwenden soll? Intellisense findet interessanterweise 
die Definition, verweißt aber auf die Mehrdeutigkeit. So etwas wie einen 
MFC namespace, mit dem ich explizit auf die von mir gewünschte Klasse 
zugreifen kann, habe ich bis jetzt nicht gefunden. Gibt es eine andere 
Möglichkeit auf die MFC Controls zuzugreifen?

Danke im Vorhinein,
Reinhard

von Karl H. (kbuchegg)


Lesenswert?

Reinhard R. schrieb:

> Meine Frage ist jetzt, wie kann ich dem Compiler klar machen dass der
> die MFC Controls verwenden soll?

Das könnte sich zu einem Rattenschwanz entwickeln.

Für CToolTipCtrl brauchst du auf jeden Fall den
afxcmn.h

(Normalerweise hat man diesen Header in der stdafx.h includiert)

Für eventuelle Basisklassen musst du dann schauen, was als nächstes 
undefiniert ist.

> die Definition, verweißt aber auf die Mehrdeutigkeit. So etwas wie einen
> MFC namespace,

Die MFC residiert in keinem namespace. Als die Grundlagen der MFC 
geschaffen wurden, gabs das alles noch nicht.

von Reinhard R. (reinhardr)


Lesenswert?

Karl heinz Buchegger schrieb:
> Für CToolTipCtrl brauchst du auf jeden Fall den
> afxcmn.h

Das war der Grund - Vielen Dank!

Bis jetzt ging ich immer davon aus dass die aktivierten MFC in den 
Projekteinstellungen dafür ausreichend sind. Heimtückischerweise findet 
Intellisense die Definition von (u.a.) CToolTipCtrl ohne Probleme in der 
afxcmn.h, auch wenn die nicht inkludiert ist. Das, und die 
uneinheitlichen Compilerfehler, maskiert das Problem zusätzlich.

Reinhard (Greenhorn)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.