mikrocontroller.net

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


Autor: Reinhard R. (reinhardr)
Datum:

Bewertung
0 lesenswert
nicht 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:
CToolTipCtrl m_ttc;
//1>d:\XXX\ug\edit controls\OXEdit.h(499) : error C2079: 'COXEdit::m_ttc' verwendet undefiniertes class 'CToolTipCtrl'

inline CToolTipCtrl* GetToolTip() { return &m_ttc; }
//1>d:\XXX\ug\edit controls\OXEdit.h(279) : error C2440: 'return': 'int *' kann nicht in 'CToolTipCtrl *' konvertiert werden


CToolInfo toolInfo;
//1>.\UG\Edit Controls\OXEdit.cpp(241) : error C2065: 'CToolInfo': nichtdeklarierter Bezeichner
//1>.\UG\Edit Controls\OXEdit.cpp(241) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'toolInfo'
//1>.\UG\Edit Controls\OXEdit.cpp(241) : error C2065: 'toolInfo': nichtdeklarierter Bezeichner


CImageList  m_leftImages;
//1>d:\XXX\ug\celltypes\UGCTMail.h(96) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_leftImages'
//1>d:\XXX\ug\celltypes\UGCTMail.h(96) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
//1>d:\XXX\ug\celltypes\UGCTMail.h(96) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
//1>d:\XXX\ug\celltypes\UGCTMail.h(97) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_rightImages'
//1>d:\XXX\ug\celltypes\UGCTMail.h(97) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
//1>d:\XXX\ug\celltypes\UGCTMail.h(97) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
//1>.\UG\CellTypes\UGCTMail.cpp(67) : error C2065: 'm_leftImages': nichtdeklarierter Bezeichner
//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:
ATLControls::CToolTipCtrl m_ttc;
...
if(::IsWindow(m_ttc.GetSafeHwnd())){...}
//1>.\UG\Edit Controls\OXEdit.cpp(152) : error C2039: 'GetSafeHwnd': Ist kein Element von 'ATLControls::CToolTipCtrlT<Base>'
//1>        with
//1>        [
//1>            Base=ATL::CWindow
//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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard R. (reinhardr)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.