ATL in MFC-Projekt einsetzen



  • 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.


  • Mod

    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.


  • Mod

    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.


  • Mod

    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?


  • Mod

    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.


  • Mod

    Warum hast Du diese Zeile auskommentiert:
    //extern CServerAppModule _Module;

    Du basteslst mir einfach zuviel herum. Ich kann langsam nicht mehr folgen, was eigentlich aus was resultiert.

    Was ist passiert als Du dirtekt das Projekt mit MFC+ATL erzeugt hast OHNE, dass Du etwas am Code geänderthat, UND Du die mitgelieferte ATLverwendet hast?



  • Das Problem ist, dass ich hier viel einbinden muss. Das sind ca. x Schritte. Und praktisch unter jeden Schritt kommt es zu anderen Fehlern. Ich werde jetzt nochmal alles durchführen und dir alle Schritte nennen und melde mich sobald ich hängenbleibe!

    Nochmal vielen Dank!



  • 1.) Ich erstelle ein MFC Projekt (Dialog) -> Das läuft erstmal.

    2.) Ich füge dem Dialog ein activeX Element hinzu -> läuft auch.

    3.) Ich importiere eine tlb-Datei mit

    #import "VKDiagramm.tlb" no_namespace named_guids \
    high_method_prefix("Call") raw_method_prefix("")

    Und füge natürlich diese Datei noch meinem Projektverzeichnis hinzu -> funktioniert auch.

    4.) Nun hab ich hier in der Anleitung für das activeX-Element stehen, dass die Dialog-Klasse folgendermaßen aufgebaut sein muss:

    class meineDialogKlasse : public CAxDialogImpl<meineDialogKlasse, CAxWindow>
    {
    public:
    enum { IDD = IDD_NOCHEINVERSUCH_DIALOG };
    }

    Meine MFC-Klasse sieht aber im Moment so aus:

    // NocheinVersuchDlg.h : Header-Datei
    //
    
    #if !defined(AFX_NOCHEINVERSUCHDLG_H__FB3EF041_B04D_48EE_A289_3FE43CA6EB6F__INCLUDED_)
    #define AFX_NOCHEINVERSUCHDLG_H__FB3EF041_B04D_48EE_A289_3FE43CA6EB6F__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    /////////////////////////////////////////////////////////////////////////////
    // CNocheinVersuchDlg Dialogfeld
    
    class CNocheinVersuchDlg : public CDialog
    {
    // Konstruktion
    public:
    	CNocheinVersuchDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(CNocheinVersuchDlg)
    	enum { IDD = IDD_NOCHEINVERSUCH_DIALOG };
    		// HINWEIS: der Klassenassistent fügt an dieser Stelle Datenelemente (Members) ein
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CNocheinVersuchDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Message-Map-Funktionen
    	//{{AFX_MSG(CNocheinVersuchDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_NOCHEINVERSUCHDLG_H__FB3EF041_B04D_48EE_A289_3FE43CA6EB6F__INCLUDED_)
    

    Wenn ich nun die Klasse abändere wie weiter oben beschrieben, so kommt es zu folgenden Fehlermeldungen. Naja, es sind 29, daher erstmal nur der erste:

    error C2504: 'CAxDialogImpl' : Basisklasse undefiniert

    Klar, schließlich enthält die atlwin.h diese Klasse.
    Also ab in die stdafx und #include <atlwin.h>
    Dann kommt der Fehler:

    fatal error C1189: #Fehler : atlwin.h requires atlbase.h to be included first

    Ok, dann muss wohl die base vor der win includiert werden, also #include <atlbase.h> davor!

    Dann komm ich zu diesem nervigen Fehler:

    d:\msstudio\vc98\atl\include\atlwin.h(63) : error C2065: '_Module' : nichtdeklarierter Bezeichner

    Und komme da erstmal nicht weiter. 😕 Schließlich kommt der Fehler in der winatl.h und bereits in der stdafx.



  • @Martin: Kannst Du vielleicht noch weiterhelfen?


  • Mod

    1. Du bist nicht den Weg gegangen, den ich gesagt habe. Hätte der Wizard eine ATL Klasse hinzugefügt wäre auch _Module definiert worden.

    Infos dazu sind bekant und dokumentiert:
    http://www.codeproject.com/wtl/mix_wtl_mfc.asp

    2. Ich verstehe nicht warum diese Klasse in der Form ein WTL/ATL Dialog sein muss.
    Willst Du nur ein ActiveX Control benutzen oder den gesamten Code dort einbinden?
    Um ein ActiveX Control zu benutzen brauchst Du den ganzen Schotter mit ATL/WTL nicht.

    3. Oder willst Du das ATL/WTL Projekt aufbohren und neue MFC Elemente hinzufügen?



  • Ich will nur das activeX Element einbinden, am besten in MFC! Mehr nicht!

    Nur habe ich hier eine Doku für die Einrichtung des activeX Elements und dort ist alles ATL bezogen. Beispiele, was dort beschrieben ist:

    - die Klasse die das activeX Element integriert muss von CAxDialogImpl vererben.
    - Der Konstruktor muss AtlAxWinInit() aufrufen // Initialisiert den AxWin hosting code.
    - Die OnInitDialog muss abgeändert werden und diese muss dann auch wieder Objekte von ATL nutzen. Z.B. CComPtr und ACxWindow.

    Ich habe im Leben noch nichts mit dem Einbinden von DLLs zu tun gehabt und habe bis auf die Doku keinen Anhaltspunkt wie ich das sonst einbinden soll.


  • Mod

    Dann ging Deine Frage und Deine Erklärungen aber 180° am Ziel vorbei.

    Hier ist eine Schritt für Schritt Anweisung wie man ein ActiveX hostet.
    http://www.codeproject.com/com/webbrowser.asp

    Und IMHO gibt es zig solcher Anleitungen mehr.
    HTH



  • Tutorials zu den Standard-directX Komponenten habe ich bereits gelesen und gearbeitet, wie z.B. den Calendar. Aber das activeX was ich einbinden muss, benötigt zur Initialisierung bereits ATL Objekt um es überhaupt ansprechen zu können (wahrs. gibts da MFC Klamotten für, aber keine Ahnung). Daher bekomm ich da nichts zustande.


Anmelden zum Antworten