ATL in MFC-Projekt einsetzen



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


  • Mod

    Du musst mir schonmehr sagen, was das ActiveX benötigt. Ein ActiveX Control benötigt von Hause aus erstmal gar kein ATL!
    Nichts dergleichen, den ActiveX basiert auf COM und COM kann man mit jedem C ansprechen, da benötigt man nicht mal C++!

    Was denkst Du denn wo Du ATL benötigdt.
    BTW: ATL kann man immer noch mit MFC zusammen verwenden. Ich mache das tagein tagaus. 😉



  • Ich hatte ja beschrieben wo ich genau festsitze, wenn ich versuche das activeX einzubinden. Kannst du mir bei dem Fehler da weiterhelfen (s.o)? Ich habe halt die Anleitung für das Einbinden und dort werden die ATL Dinge benötigt, wie ich auch schon weiter oben beschreiben habe, kannst Du damit was anfangen?

    Vielen Dank für Deine Hilfe!


  • Mod

    Du verstehst nicht was ich sage:
    Dein ActiveX Control benötigt ATL nicht! Also brauchst Du es auch nicht einbinden.

    Ich weiß nicht mehr was ich Dir noch sagen soll... 😕



  • Die ATL ist eine Library um ActiveX-Komponenten zu entwickeln. Also ein Toolset, aus dem am Ende ein ActiveX raus kommt. Ein ActiveX spricht man aber als User ohne ATL an, da ActiveX-Schnittstellen keine komplexen Objekte verstehen, sondern nur bestimmte spezifizierte Datentypen. Diese Datentypen sind aber primitiv und benötigen keine komplexen Typen (Klassen).

    Wenn du also ein fertiges ActiveX (z.B. den Windows Mediaplayer) in deine MFC-Anwendung einbinden willst, lässt du es einfach in deine UI reinfallen. Und dann kannst du dir anschauen, welche Schnittstellen von der Komponenten angeboten werden. Es gibt auch einen ActiveX-Container (heißt der so?), in dem du ein ActiveX begutachten und ausprobieren kannst - ohne ATL! Ich weiß nicht ob unter VC6 auch schon dieser Testcontainer bei war... schau mal unter Tools.



  • Ok, wenns so geht wäre es natürlich super. Ich kann das activeX-Element mit rechter Maustaste und activeX einfügen einfach in den Dialog grafisch einfügen. Aber wie sprech ich das jetzt an? Es ist eine DLL um Diagramme zu zeichnen, was auch funktioniert, wenn ich das mit dem ATL Zeug wie beschrieben einbinde. Nur habe ich den Rest halt in MFC programmiert und das bekomme ich dann wie schon beschrieben nicht dazu.

    Das Grundproblem ist also. Wie kann ich nun dem activeX-Element sagen, dass er ne Grafik zeichnen soll? (da kann mir hier sicherlich keiner weiterhelfen, da ich die DLL ja nur hier habe) Da nützen mir die Beispiele wie man einen Calendar oder andere activeX Elemente einbindet leider nichts :(.


  • Mod

    plizer:
    Du musst schon ein wenig lesen! Du bekommst einen entsprechenden Wrapper in Deinem Dialog, der die entsprechenden Methoden abbildet.
    Ich kann Dir doch nicht alles vorbröseln.

    Hast Du denn schon mal angesehen, welchen Wrapper Code die MFC dort erzeugt?
    Wenn nein! Warum nicht?

    http://msdn2.microsoft.com/en-us/library/6xzc178b(VS.80).aspx

    BTW: Ich verliere langsam die Geduld...



  • Du bekommst einen entsprechenden Wrapper in Deinem Dialog, der die entsprechenden Methoden abbildet.

    Das hab ich noch in keinem der ganzen Bücher gelesen, dass es sowas gibt.

    Hast Du denn schon mal angesehen, welchen Wrapper Code die MFC dort erzeugt?
    Wenn nein! Warum nicht?

    Wrapper Code? Wo wird das erzeugt? Wenn ich davon was gehört hätte, hätte ich vielleicht mal geschaut.

    Leider hilft der Link kein Stück weiter...

    Aber trtzodem danke für die Hilfe.


  • Mod

    Also Programming Visual C++ (Kruglinski)
    Teil II, Kapitel 8!

    Da wird das z.B. gezeigt. Dort wird ein Calendar Control eingefügt über den Wizard. Dieser erzeugt einen Wrapper, also einfachen C++ Code der die COM Funktionen wrapped...

    Soll ich jetzt noch mehr über COM-Wrapper schreiben?

    Und nochmal verweise ich Dich auf diesen Artikel:
    http://www.codeproject.com/com/webbrowser.asp


Anmelden zum Antworten