Esempio di attributi ATLTangram: dimostrazione della gestione di progetti di grandi dimensioni che utilizzano ATL, MFC e COM
Aggiornamento: novembre 2007
ATLTangram rappresenta il porting dell'esempio Tangram riportato nell'ultimo capitolo di Inside COM di Dale Rogerson (http://www.eu.microsoft.com/italy/mspress/default.htm), che ha gentilmente concesso di utilizzare il codice da lui elaborato in un esempio relativo ad ATL. Questo esempio consente di convertire un'applicazione COM preesistente in un'applicazione in cui viene utilizzata un'infrastruttura ATL.
ATLTangram è un progetto di grandi dimensioni costituito dalla soluzione ATLTangram, che rappresenta il controller master di sei sottoprogetti: MFCTangram, ATLModel, ATLGdiWorld, ATLGLWorld, ATLModelExe e ATLTangramCanvas. Nell'esempio vengono illustrate numerose funzionalità dell'ambiente di sviluppo integrato (IDE) e numerosi concetti di COM. Viene inoltre illustrato l'utilizzo di MFC come client di server COM ATL.
Nota sulla sicurezza: |
---|
Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti. |
Per ottenere gli esempi e le istruzioni per l'installazione:
In Visual Studio scegliere Esempi dal menu ?.
Per ulteriori informazioni, vedere Individuazione dei file di esempio.
La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.
È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.
Generazione ed esecuzione dell'esempio
Per generare ed eseguire l'esempio
Aprire il file di soluzione atltangram.sln.
Scegliere Genera soluzione dal menu Genera.
Scegliere Avvia senza eseguire debug dal menu Debug.
Verrà visualizzata una finestra di dialogo. Selezionare una delle opzioni. Verrà avviato il programma Tangram.
Gestione di un progetto di grandi dimensioni
Nella soluzione sono state definite le interdipendenze all'interno dell'IDE. Per tali interdipendenze, correlate al percorso, viene utilizzata la struttura di directory predefinita dell'esempio.
La gerarchia delle dipendenze è simile alla seguente:
MFCTangram
ATLGLWorld
ATLGdiWorld
ATLTangramCanvas
ATLModel
ATLModelExe
ATLModel
ATLModel
Tutte le impostazioni del progetto sono già definite all'interno dell'esempio. Per esaminare le interdipendenze del progetto, attenersi alla procedura riportata di seguito.
Scegliere Proprietà dal menu Progetto.
Selezionare la soluzione Atltangram in Esplora soluzioni.
Nella finestra di dialogo Pagine delle proprietà espandere la cartella Proprietà comuni, quindi selezionare Esegui debug dei file di origine. Esaminare la casella Cerca file di origine nei seguenti percorsi.
Scegliere Dipendenze progetto, quindi esaminare i nomi dei progetti dipendenti.
Nei progetti ATLModel e ATLModelExe viene illustrato come configurare un server COM in modo da consentirne la generazione come server in-process o come server locale utilizzando lo stesso insieme di file e due file di progetto. L'utilizzo di due file di progetto consente di includere le dipendenze sia nella DLL sia nel file EXE.
Funzionalità COM/ATL
L'esempio rappresenta un sistema COM costituito da più server COM e da un'applicazione MFC che utilizza i server. Nell'esempio viene evidenziata la comunicazione tra i moduli mediante il meccanismo dei punti di connessione e vengono illustrati i server in-process e locali.
Ulteriori funzionalità illustrate
Nei server ATL, per gli insiemi viene utilizzata la libreria STL (Standard Template Library).
Nel driver MFC vengono utilizzate le classi basate su template MFC.
Il driver MFC, un esempio di applicazione senza l'architettura documento/vista, utilizza una classe derivata da CFrameWnd come finestra di output per il disegno dei pezzi di Tangram.
Attributi
Nell'esempio vengono utilizzati i seguenti attributi:
ATLTANGRAM export, helpstring, object, pointer_default, uuid
ATLTANGRAM/atlgdiworld coclass, com_interface_entry, default, dll, event_receiver, helpstring, iid_is, implements_category, in, module, name, object, out, pointer_default, progid, registration_script, size_is, unique, uuid, version, vi_progid
ATLTANGRAM/atlglworld coclass, com_interface_entry, default, dll, event_receiver, helpstring, implements_category, in, module, name, object, out, pointer_default, progid, registration_script, uuid, vi_progid
ATLTANGRAM/atlmodel coclass, default, dll, event_source, exe, helpstring, in, module, name, object, out, pointer_default, progid, size_is, uuid
ATLTANGRAM/atltangramcanvas coclass, default, dll, helpstring, in, module, name, object, out, pointer_default, progid, registration_script, uuid, vi_progid
Classi e parole chiave
Nell'esempio vengono utilizzate le seguenti classi ATL:
CComObjectRootEx, CComCoClass, CComControl, IDispatchImpl, IProvideClassInfo2Impl, IPersistStreamInitImpl, IPersistStorageImpl, IPersistPropertyBagImpl, IPerPropertyBrowsingImpl, IQuickActivateImpl, IObjectSafetyImpl, IOleControlImpl, IOleObjectImpl, IOleInPlaceActiveObjectImpl, IViewObjectExImpl, IOleInPlaceObjectWindowlessImpl, IDataObjectImpl, ISupportErrorInfo, ISpecifyPropertyPagesImpl, IConnectionPointContainerImpl, IPropertyNotifySinkCP, CDialogImpl
Nell'esempio vengono utilizzate le seguenti classi MFC:
CFrameWnd, CTypedPtrList<>, CDialog, CWinApp e altre classi supportate
Nell'esempio vengono utilizzate le parole chiave seguenti:
_ASSERTE; AddRef; AddUpdateRect; Advise; assert; ASSERT; ATLTRACE; auxSolidSphere; BEGIN_COM_MAP; BEGIN_CONNECTION_POINT_MAP; BEGIN_MESSAGE_MAP; BEGIN_OBJECT_MAP; BitBlt; CATEGORYINFO ; CComCoClass; CComModule::GetClassObject; CComModule::GetLockCount; CComModule::Init; CComModule::RegisterServer; CComModule::Term; CComModule::UnregisterServer; CComObjectRootEx; CExeModule::Init; CExeModule::RegisterClassObjects; CExeModule::RegisterServer; CExeModule::RevokeClassObjects; CExeModule::UnregisterServer; CExeModule::UpdateRegistryFromResource; CFrameWnd::AssertValid; CFrameWnd::Dump; CFrameWnd::PreCreateWindow; ChoosePixelFormat; CModelList; CoCreateInstance; CoInitializeEx; COM_INTERFACE_ENTRY; COM_INTERFACE_ENTRY_AGGREGATE; COM_INTERFACE_ENTRY_IMPL; CONNECTION_POINT_ENTRY; CopyRect; CoTaskMemFree; CProxyIATLTangramModelEvent; CreateCompatibleDC; CreatePalette; CWnd::CreateEx; DECLARE_GET_CONTROLLING_UNKNOWN; DECLARE_MESSAGE_MAP; DECLARE_ONLY_AGGREGATABLE; DECLARE_REGISTRY_RESOURCEID; DeleteObject; DescribePixelFormat; DisableThreadLibraryCalls; DispatchMessage; DoButtonDown; DoModal; END_COM_MAP; END_CONNECTION_POINT_MAP; END_MESSAGE_MAP; END_OBJECT_MAP; EqualRect; ErrorMessage; GdiFlush; GetBoundingRect; GetClientRect; GetCommandLine; GetControllingUnknown; GetDC; GetMessage; GetModuleFileName; GetObject; GetPalette; GetPaletteEntries; GetPixelFormat; GetRotation; GetVertices; glBegin; glClearColor; GLdouble CoCreateInstance; glEnable; glEnd; glFlush; glGetIntegerv; glInitNames; glLightfv; glLightModelfv; glLoadIdentity; glMatrixMode; glNormal3d; glPolygonMode; glPopMatrix; glPopName; glPushMatrix; glPushName; GLRender; glRenderMode; GLResize; glRotated; glSelectBuffer; GLSetup; glTranslated; glTranslatef; gluPerspective; gluPickMatrix; gluUnProject; glVertex2d; glVertex3d; glViewport; HPALETTE; ICatInformation::EnumClassesOfCategories; ICatRegister::QueryInterface; ICatRegister::RegisterCategories; ICatRegister::RegisterClassImplCategories; ICatRegister::UnRegisterCategories; ICatRegister::UnRegisterClassImplCategories; IConnectionPointContainer::FindConnectionPoint; IConnectionPointContainer::Release; IConnectionPointContainerImpl; InitInstance; InvalidateRect; IsCurrent; IsValidAddress; IUnknown::Release; LoadIcon; LoadStandardCursor; LocalFree; MakeCurrent; OBJECT_ENTRY; ON_COMMAND; ON_WM_DESTROY ; OnCancel; OnDestroy; OnInitDialog; OnOK; OnQueryNewPalette; OutputDebugString; OutputGlError; Polygon; PreCreateWindow; PtInRegion; QueryInterface; RealizePalette; Release; ReleaseConnectionPoint; ReleaseDC; Rotate; SelectObject; SelectPalette; SetPixelFormat; SetRectEmpty; specifyMaterial; StringFromCLSID; SubkeyExists; va_end; wcscpy_s; wglCreateContext; wglGetCurrentContext; wglMakeCurrent
Nota: |
---|
Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata. |