ATL in MFC-Projekt einsetzen
-
Ich bin dabei, aber da fehlt natürlich ne Menge. Und helfen kann man da per Ferndiagnose warhs. auch nur schlecht. Wenns garnicht mehr geht, werde ich hier nochmal um Hilfe bitten. Beispielsweise soll halt eine Klasse direkt von ATL-Klassen erben, hab noch keine Ahnung, ob das dann mit MFC geht. Hab da noch nicht wirklich nen Plan davon.
-
ATL und MFC arbeiten perfekt mitenander. Da gibt es gar keine Probleme. Einfach entsprechende Header einbauen und ATL benutzen.
-
Leider bekomme ich das mit dem Zusammenbringen nicht hin.
Ich versuche gerade die in einem ATL-Projekt MFC-Komponenten verfügbar zu machen. Füge ich keine Header von der MFC ein, fehlen diese natürlich (z.B. CDialog), füge ich den Header afxwin.h ein sind wiederrum CString besipeilweise doppelt drin und der Compiler meckert. Ich habe alles versucht. Entweder es fehlen MFC-Klassen oder diese werden doppelt eingebunden...
-
afxwin.h zuerst einbinden dann die ATL Header!
-
Im Moment bekomme ich dann folgende Fehlermeldungen:
error C2664: 'CreateCompatibleDC' : Konvertierung des Parameters 1 von 'struct HDC__ *' in 'class CDC *' nicht moeglich
error C2065: 'SelectBitmap' : nichtdeklarierter Bezeichner
error C2440: '=' : 'int' kann nicht in 'struct HBITMAP__ *' konvertiert werden
Aber ich bin mir sicher, dass wenn ich diese Fehler behebe, dass mind. 5 neue dazukommen, das geht mittlerweile seit über 10 Stunden so...
EDIT: Die Fehler verweisen auf die atlgdi.h
-
Wie hast Du es denn gemacht?
Welchen Compiler verwendest Du?Was ist das für ein Projekt?
Zeige uns doch mal die stdafx.h!
-
Ich verwende VC++ 6.0.
Ich habe erst ein ATL Projekt erstellt, um ein bestimmtes activeX Element einbinden zu können, da ich nur Infos habe, wie man es in ATL einbindet. Anschließend will ich allerdings noch MFC Komponenten einbinden, da ich mit der ATL garnicht klar komme bzw. nicht weiss, wie ich da nen grafischen Baum erstellen soll.
Hier ist die stdafx, allerdings muss ich sagen, dass die schon auch ganz anders aussah, hab halt alles mögliche versucht und die sah wahrscheinlich auch schon besser aus...
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//#if !defined(AFX_STDAFX_H__2E7AD113_FAE5_4378_A0E6_498224EF8FA5__INCLUDED_)
#define AFX_STDAFX_H__2E7AD113_FAE5_4378_A0E6_498224EF8FA5__INCLUDED_// Change these values to use different versions
#define WINVER 0x0400
#define _WIN32_WINNT 0x0400
#define _WIN32_IE 0x0400
#define _RICHEDIT_VER 0x0100#define _ATL_APARTMENT_THREADED
#include <afxwin.h> // MFC-Kern- und -Standardkomponenten
#include <afxext.h>
#include <afxdisp.h>#include <atlbase.h>
#include <atlapp.h>extern CServerAppModule _Module;
#import "VKDiagramm.tlb" no_namespace named_guids \
high_method_prefix("Call") raw_method_prefix("")
// This is here only to tell VC7 Class Wizard this is an ATL project
#ifdef ___VC7_CLWIZ_ONLY___
CComModule
CExeModule
#endif#include <atlcom.h>
#include <atlhost.h>
#include <atlwin.h>
#include <atlctl.h>#include <atlframe.h>
#include <atlctrls.h>
#include <atldlgs.h>
#include <atlctrlw.h>
#include <atlmisc.h>#include "DateTime.hpp"
#include "FTTime.hpp"#include <afxwin.h> // MFC-Kern- und -Standardkomponenten
#include <iostream>
#include <string>
#include <vector>
#include <map>
//using namespace std;
//#include <cdialog.h>//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.#endif // !defined(AFX_STDAFX_H__2E7AD113_FAE5_4378_A0E6_498224EF8FA5__INCLUDED_)
-
Und beim compilieren der stdafx.cpp kommt bereits der Fehler?
-
Also das gibt er unten alles aus:
--------------------Konfiguration: Trending - Win32 Debug--------------------
Kompilierung läuft...
StdAfx.cpp
d:\msstudio\vc98\wtl75\include\atlgdi.h(3379) : error C2664: 'CreateCompatibleDC' : Konvertierung des Parameters 1 von 'struct HDC__ *' in 'class CDC *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
d:\msstudio\vc98\wtl75\include\atlgdi.h(3383) : error C2065: 'SelectBitmap' : nichtdeklarierter Bezeichner
d:\msstudio\vc98\wtl75\include\atlgdi.h(3383) : error C2440: '=' : 'int' kann nicht in 'struct HBITMAP__ *' konvertiert werden
Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
e:\trending (mfc)\stdafx.h(95) : fatal error C1020: Unerwartetes #endif
Fehler beim Ausführen von cl.exe.
-
Was ist das bitte für eine ATL die Du da verwendest? Die normale Version ist das nicht!
-
Ja, frag mich mal! Irgendwie sind bei allen Projekten die ich vorliegen haben verschiedene Versionen gemischt (ATL und WTL) und alles ist ziemlich alt. Und es haben sich in der Firma schon viele daran versucht und keiner hat was zusammenbekommen... wie gut dass das Projekt am 17.7 fertig sein muss und ich seit Wochen nicht wirklich etwas zustande bekomme, ist doch zum heulen...
Ich werde nun wohl versuchen alles bereits in MFC programmierte doch in ATL zu realisieren. Aber finde mal zum VC6.0 noch nen guten Tutorial im Inet. Bücher haben wir zu dem überhaupt nicht.
-
Nochmal meine Frage: Die WTL 7.5 verwendet welche ATL?
Warum wird eine ATL Version verwendet, die nicht vom Compiler stammt?
Ist diese überhaupt VC6 kompatibel.Bist Du sicher, dass nicht Hedaer mehrfach eingebunden werden und das ganz sichernur eine ATL Version benutzt wird?
-
Das Problem ist, dass ich Dir keine Frage davon beantworten kann, weil ich damit noch nie zu tun hatte! VC6 kompatibel müsste es sein, weil das hier immer eingesetzt wurde. Wo kann ich denn die aktuelle ATL runterladen. Dann versuch ich es damit dann einfach nochmal und vergesse dann das Zeug was hier eingebunden wird.
-
Genau das ist der falsche Ansatz: Es gibt keine "aktuelle" ATL!
Sonderrn immer nur eine ATL, die mit einer bestimmten Visual-Studio Version ausgeliefert wird. Hier wurde offensichltich bei Euch irgendwie eine ATL Version unter den WTL-Code beigemischt...
Ich kann mir nicht vorstellen, das diese WTL Version so heruntergeladen wurde.
-
@Martin: Danke für Deine Hilfe!

Hab gleich noch eine Frage. Ich habe nun ein ATL Projekt in dem ich mit dem grafischen Editor einen Baum hinzugefügt habe. Ich denke das ist dann der CTreeCtrl? Wenn ich nun in der h.-Datei allerdings eine Variable für de CTreeCtrl anlegen will, z.B. m_TreeCtrl, dann erhalte ich folgende Fehlermeldung:
error C2501: 'CTreeCtrl' : Fehlende Speicherklasse oder Typspezifizierer
Der CTreeCtrl befindet sich soweit ich weiß in der afxcmn.h, also:
#include <afxcmn.h>
Dann kommt allerdings die Fehlermeldung:
error C2872: 'CString' : Mehrdeutiges Symbol
Sowie auch zu Klassen wie CStringData, CPoint, CRect, usw...
Was kann ich dagegen tun?
-
afxwin.h als include einführen!
Und ich wiederhole mich:
Erst afxwin.h einbauen dann ATL includes!
Andersherum geht es nicht!Die gültigen ATL Dateien stehen mit Sicherheit nicht in dem Ordner d:\msstudio\vc98\wtl75\ Sondern in dem include Ordner Deiner VC6 Installation.
Ob Deine Dateien mit VC6 in irgendeiner Weise kompatibel sind oder mit der MFC Version aus VC6 kann Dir wahrscheinlich niemand sagen.
Versuch es selbst:
Erzeuge ein MFC Programm mit dem Wizard.
Starte den Wizard und für eine ATL Klasse ein.Projekt müsste laufen.
-
Ich hab es jetzt genauso versucht. Aber egal was ich mache es kommt immer der Fehler:
d:\msstudio\vc98\atl\include\atlwin.h(63) : error C2065: '_Module' : nichtdeklarierter Bezeichner
Ich nutze jetzt auch nur das mitgelieferte ATL von dem VC6.
Meine stdafx.h sieht folgendermaßen aus:
// stdafx.h : Include-Datei für Standard-System-Include-Dateien,
// oder projektspezifische Include-Dateien, die häufig benutzt, aber
// in unregelmäßigen Abständen geändert werden.
//#if !defined(AFX_STDAFX_H__BC0BD32A_CE38_4384_9562_228CE991A668__INCLUDED_)
#define AFX_STDAFX_H__BC0BD32A_CE38_4384_9562_228CE991A668__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define VC_EXTRALEAN // Selten verwendete Teile der Windows-Header nicht einbinden
#include <afxwin.h> // MFC-Kern- und -Standardkomponenten
#include <afxext.h> // MFC-Erweiterungen
#include <afxdisp.h> // MFC Automatisierungsklassen
#include <afxdtctl.h> // MFC-Unterstützung für allgemeine Steuerelemente von Internet Explorer 4
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC-Unterstützung für gängige Windows-Steuerelemente
#endif // _AFX_NO_AFXCMN_SUPPORT//extern CServerAppModule _Module;
#include <atlbase.h>
#include <atlwin.h>#import "VKDiagramm.tlb" no_namespace named_guids \
high_method_prefix("Call") raw_method_prefix("")//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.#endif // !defined(AFX_STDAFX_H__BC0BD32A_CE38_4384_9562_228CE991A668__INCLUDED_)
-
Jep, bereits da, nämlich beim include von der atlwin.h!
-
Ich habe schon einiges versucht und es auch mal geschafft den Fehler wegzubekommen, allerdings kam dann diese Fehlermeldung:
atlgdi.h(3379) : error C2664: 'CreateCompatibleDC' : Konvertierung des Parameters 1 von 'struct HDC__ *' in 'class CDC *' nicht moeglich
Auch die Tutorials die ich auf Codeproject dazu finde helfen mir nicht weiter...
-
Obwohl sich natürlich die Frage stellt, ob ich den Fehler wegebekommen habe oder dieser einfach nur von einem neuen Fehler überdeckt wurde.