ATL Klasse instanziieren:
-
Hallo Forum,
ich habe mit dem Visual Studio Assistenten die ATL Klasse CAtlPerson am Ende dieses Posting erstellt. Ich möchte nun diese Klasse instanziieren. Wenn ich es versuche erhalte ich die Meldung das die Klasse abstrakt sei. (Siehe Fehlermeldungen weiter unten.) Wenn ich nach QueryInterface() im Web suche dient diese Funktion dem Auffinden anderen Interfaces eine Objektes. Was muß ich also tun um diese Funktion zu implementieren? Ich würde mir als Com Neuling nicht zutrauen diese Funktion selbst zu schreiben. Meine Idee geht in die Richtung das ich einfach meine CAtlPErson Klasse von einer anderen Basisklasse ableite wo diese Funktionen schon implementiert sind. Immerhin kann VB eine Instanz von CAtlPerson erstellen und sie mir übergeben. Also irgendwie muß es möglich sein eine Instanz von CAtlPerson zu erstellen...
Vielen Dank
Bommel
Die Fehlermeldungen:
t:\aa\AtlCompany.cpp(20) : error C2259: 'CAtlPerson': Instanz von abstrakter Klasse kann nicht erstellt werden aufgrund folgender Member:
'HRESULT CAtlPerson::QueryInterface(const IID &,void ** ) throw()': Rein virtuelle Funktion wurde nicht definiert
t:\aa\AtlCompany.h(32): Siehe Deklaration von 'CAtlPerson::QueryInterface'
'ULONG CAtlPerson::AddRef(void) throw()': Rein virtuelle Funktion wurde nicht definiert
t:\aa\AtlCompany.h(32): Siehe Deklaration von 'CAtlPerson::AddRef'
'ULONG CAtlPerson::Release(void) throw()': Rein virtuelle Funktion wurde nicht definiert
t:\aa\AtlCompany.h(32): Siehe Deklaration von 'CAtlPerson::Release'
'HRESULT CAtlPerson::QueryInterface(const IID &,void ** ) throw()': Rein virtuelle Funktion wurde nicht definiert
t:\aa\AtlCompany.h(32): Siehe Deklaration von 'CAtlPerson::QueryInterface'
'ULONG CAtlPerson::AddRef(void) throw()': Rein virtuelle Funktion wurde nicht definiert
t:\aa\AtlCompany.h(32): Siehe Deklaration von 'CAtlPerson::AddRef'
'ULONG CAtlPerson::Release(void) throw()': Rein virtuelle Funktion wurde nicht definiert
t:\aa\AtlCompany.h(32): Siehe Deklaration von 'CAtlPerson::Release'Die Klasse CAtlPerson:
// AtlPerson.h : #pragma once #include "resource.h" #include "person.h" // IAtlPerson [ object, uuid("61088B1C-1D93-4930-9447-17484D452870"), dual, helpstring("IAtlPerson-Schnittstelle"), pointer_default(unique) ] __interface IAtlPerson : IDispatch { [id(1), helpstring("method SetName")] HRESULT SetName([in] BSTR Name); [id(2), helpstring("method GetName")] HRESULT GetName([out,retval] BSTR* Name); }; // CAtlPerson [ coclass, threading("apartment"), vi_progid("aa.AtlPerson"), progid("aa.AtlPerson.1"), version(1.0), uuid("DBE275A5-B9ED-44F4-96A7-3A2DD52AA996"), helpstring("AtlPerson Class") ] class ATL_NO_VTABLE CAtlPerson : public IAtlPerson { public: CAtlPerson() {} DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct() { return S_OK; } void FinalRelease() { } public: CPerson GetObj(void); void SetObj(CPerson &Person); private: CPerson m_oPerson; public: STDMETHOD(SetName)(BSTR Name); STDMETHOD(GetName)(BSTR* Name); };
-
Ich kann nur dazu raten Attributed ATL nicht mehr zu verwenden. Das ist so buggy, dass es nicht auszuhalten ist.
Zudem ist der Support in der Zukunft ungewiss.
Das ganze ist zwar nett aber undurchsichtig.Verwende die ATL Templates.
-
Zu meiner Frage: Man muß das Objekt über COM erstellen:
STDMETHODIMP CAtlCompany::GetCustomer(IAtlPerson** Customer) { HRESULT hres; void *tmp=0; hres = CoInitializeEx(0, COINIT_MULTITHREADED); hres = CoCreateInstance(CLSID_CAtlPerson, 0, CLSCTX_SERVER, IID_IAtlPerson, &tmp); if (hres == S_OK) { CAtlPerson *oPerson = (CAtlPerson *)tmp; oPerson->SetObj(m_oCompany.GetPerson()); *Customer = (IAtlPerson *)oPerson; } CoUninitialize(); return S_OK; }Wenn ich nach "Attributed ATL" finde ich im deutschen Web ganz oben Deine Webseite. Im englischen Web finde ich auch nichts Erklärendes. Gibt es dafür einen anderen Namen?
-
Such mal nach "Attributed Programming"!
1. Lass diesen Quatsch mit CoInitializeEx etc.
2. CAtlPerson musst Du instanziieren und hier kommt darauf an wie. Cachale, Singleton. Schau Dir die Doku zu CComObject<TBase>::CreateInstance an.
3. Lies ein gescheites Buch über ATL (z.B. ATL Internals, Rector/Sells, das Beste was ich kenne)
-
Martin Richter schrieb:
Such mal nach "Attributed Programming"!
1. Lass diesen Quatsch mit CoInitializeEx etc.
2. CAtlPerson musst Du instanziieren und hier kommt darauf an wie. Cachale, Singleton. Schau Dir die Doku zu CComObject<TBase>::CreateInstance an.
3. Lies ein gescheites Buch über ATL (z.B. ATL Internals, Rector/Sells, das Beste was ich kenne)Die Initialize Funktionen habe ich herausgenommen.
Zu Attributed Programming habe ich dieses gefunden:
http://msdn2.microsoft.com/en-us/library/zkwy014e(VS.80).aspxVielen Dank

Bommel
-
Für Dein Thema hier ein Walkthrough:
http://msdn2.microsoft.com/en-us/library/ctkast1b(VS.80).aspx
-
Vielen Dank für den Link.