2010-12-06 11 views
5

Escribo un proyecto ATL y me pregunto cómo debería crear clases aquí. Ahora tengo una clase creada por Add/Class/ATL Simple Object. Quiero dividirlo en clases más pequeñas pero el método de esta clase debe usar CComPtr y tener CComPtr como argumento. No puedo crear clases C++ 'simples' porque no tengo CComPtr allí.¿Cómo debo crear clases en el proyecto ATL?

Debo crear clases ATL por ATL Simple Object Wizard y luego uso la interfaz para esta clase para llamar a los métodos. Como aquí:

CComPtr<ITestAtlClass> tptr; 
tptr.CoCreateInstance(CLSID_TestAtlClass); 
tptr->test(); 

Y debo añadir todos los métodos públicos por Vista de clases/ITestAtlClass/Add/Agregar método? ¿Qué hay de los constructores? ¿Debo inicializar mi clase solo por propiedades (y agregarlas por Class View/ITestAtlClass/Add/Add Property)? ¿Y pasar cada objeto com por la interfaz IUnknown?

¿Alguien puede decirme cómo se debe hacer en el proyecto ATL. Usaré estas clases más pequeñas internamente (nadie creará estas clases fuera de mi DLL) solo para hacer que mi código sea más legible.

+2

Solo crea clases ATL para las interfaces que deberían estar visibles fuera de la DLL. –

+0

@ Hans Passant Pero no puedo crear clases C++ simples que usen CComPtr por ejemplo. ¿Cómo usarlo? –

Respuesta

8

No entiendo su comentario de que no puede usar CComPtr de una simple clase de C++. ¿Puedes por favor aclarar?

veo dos estrategias:

  • construir un C limpia ++ modelo de objetos que resuelve el problema, y ​​luego se envuelve en una capa fachada fina de uno o más objetos COM
  • clases
  • Uso ATL partes, y use CComObject<> y derivados para instanciar y mantener estos sin la sobrecarga de CoCreateInstance y las limitaciones de solo usar interfaces públicas.

La primera es generalmente mucho mejor, pero si está construyendo un modelo de objeto con muchos datos, la segunda puede ser una técnica útil.

Si tiene una clase COM de ATL llamada CVehicle, que deriva de CComObjectRootEx<> y amigos, puede crear una instancia así;

CComObject<CVehicle>* vehicle = NULL; 
    CComObject<CVehicle>::CreateInstance(&vehicle); 

    vehicle->AddRef(); 

    // To get at any of its interfaces, use: 
    CComPtr<ICar> car = 0; 
    vehicle->QueryInterface(&car); 

    // And to delete object, use: 
    vehicle->Release(); 

También hay variaciones en CComObject<>, por ejemplo CComObjectStack<> que utilizan diferentes estrategias de asignación y referencia de conteo.

Como puede ver, esto es bastante desordenado. Si puede explicar lo que quiere decir con su comentario sobre no poder usar CComPtr, tal vez pueda ampliarlo.

+0

¡Muchas gracias! Parece que simplemente no entiendo cómo usar estas clases de ATL. Ahora, cuando me mostró esta muestra, encontré lo mismo en [MSDN] (http://msdn.microsoft.com/en-us/library/9e31say1.aspx). ¿Puedo crear clases ATL como esa también ?: 'CComObject vehicle; vehicle.someMethod() '¿Entonces no tendré que preocuparme por liberar memoria? O puedo escribir algo como esto: 'CComPtr >; CComObject :: CreateInstance (& vehicle); '¿Y se liberará cuando no sea necesario? –

+0

Cuando dije que no puedo usar CComPtr, no sabía cómo crear objetos ALT ... Traté de incluir 'atlcomcli.h' y' atlcom.h' a la clase normal de C++ (crated sin ATL Simple Object Wizard). Estoy un poco avergonzado, pero estos recursos de ATL no son geniales. –

+0

Para crear objetos en la pila, como muestra, usa 'CComObjectStack <>'. No estoy seguro si un CComObjectStack se puede incrustar dentro de otra clase como una variable miembro, es posible que desee leer sobre las otras variaciones de CComObject. –

Cuestiones relacionadas