Fundamentals Of COM(+) (Part 2)
description
Transcript of Fundamentals Of COM(+) (Part 2)
![Page 1: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/1.jpg)
Fundamentals Of COM(+) Fundamentals Of COM(+) (Part 2)(Part 2)
![Page 2: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/2.jpg)
COM – The ideaCOM – The idea
COM is based on three fundamental ideasCOM is based on three fundamental ideas Clients program in terms of interfaces, Clients program in terms of interfaces,
not classesnot classes Implementation code is not statically linked, Implementation code is not statically linked,
but rather loaded on-demand at runtimebut rather loaded on-demand at runtime Object implementers declare their runtime Object implementers declare their runtime
requirements and the system ensures that requirements and the system ensures that these requirements are metthese requirements are met
The former two are the core of classic COMThe former two are the core of classic COM The latter is the core of MTS and COM+The latter is the core of MTS and COM+
![Page 3: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/3.jpg)
Tale Of Two COMsTale Of Two COMs COM is used primarily for two tasksCOM is used primarily for two tasks Task 1: Gluing together multiple components Task 1: Gluing together multiple components
inside a processinside a process– Class loading, type information, etc
Task 2: Inter-process/Inter-host Task 2: Inter-process/Inter-host communicationscommunications– Object-based Remote Procedure Calls (ORPC)
Pros: Same programming model and APIs used Pros: Same programming model and APIs used for both tasksfor both tasks
Cons: Same programming model and APIs Cons: Same programming model and APIs used for both tasksused for both tasks
Design around the task at handDesign around the task at hand
![Page 4: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/4.jpg)
DefinitionsDefinitions Two key terms have been defined so farTwo key terms have been defined so far A A COM InterfaceCOM Interface is a collection of abstract is a collection of abstract
operations one can perform on an objectoperations one can perform on an object– Must extend IUnknown directly or indirectly– Identified by a UUID (IID)– Platform-specific vptr/vtable layout
A A COM Object COM Object is a collection of vptrs in memory is a collection of vptrs in memory that follow the COM identity lawsthat follow the COM identity laws– Must implement at least one COM interface– QueryInterface ties vptrs together into
cohesive object Objects assumed to materialize from thin air!Objects assumed to materialize from thin air!
![Page 5: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/5.jpg)
DefinitionsDefinitions A A COM ClassCOM Class (or (or coclasscoclass) is a named body of code that ) is a named body of code that
can be used to produce COM objectscan be used to produce COM objects All coclasses are named by a UUID (CLSID)All coclasses are named by a UUID (CLSID) All coclasses have a distinguished object that is used All coclasses have a distinguished object that is used
to create new instancesto create new instances– Called a class object or class factory– Typically implements IClassFactory
All coclasses loaded on demand by class loaderAll coclasses loaded on demand by class loader– Called the Service Control Manager or (SCM)
For efficiency, a single component DLL can support For efficiency, a single component DLL can support multiple COM classesmultiple COM classes
![Page 6: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/6.jpg)
Classes, Class Objects, Classes, Class Objects, And ComponentsAnd Components
Class AClass AClass BClass BClass CClass C
Class ObjectsClass Objects
Class InstancesClass InstancesComponent DLLComponent DLL
![Page 7: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/7.jpg)
Class Versus TypeClass Versus Type
An Interface represents a data type suitable for An Interface represents a data type suitable for declaring variablesdeclaring variables– Non-trivial operations– Hierarchical with respect to one another– Polymorphic with respect to different objects
A Class represents loadable concrete code used A Class represents loadable concrete code used to create objectsto create objects– Resultant objects implement one or more interfaces
Class unsuitable for declaring variablesClass unsuitable for declaring variables– Entire motivation for interface-based programming based on
relative uselessness of class
![Page 8: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/8.jpg)
Class Versus TypeClass Versus TypeIAnimalIAnimal
PugPug SiameseSiamese ParrotParrot
DogCatDogCat RobinRobin
IMammalIMammal
IDogIDog ICatICat IBirdIBird
InterfacesInterfaces
ClassesClasses
![Page 9: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/9.jpg)
The COM Runtime EnvironmentThe COM Runtime Environment
The infrastructure used to support COM on a given The infrastructure used to support COM on a given platform is called platform is called the COM librarythe COM library
Each thread that uses COM library must setup/teardown Each thread that uses COM library must setup/teardown thread-specific data structuresthread-specific data structures– CoInitialize[Ex] and CoUninitialize do this for you
The COM library implemented in several DLLsThe COM library implemented in several DLLs– OLE32.DLL – core class/interface functionality– OLEAUT32.DLL – Visual Basic®-centric type infrastructure
Inproc class loading done in OLE32.DLLInproc class loading done in OLE32.DLL Cross-process/host class loading performed by Cross-process/host class loading performed by
Windows NTWindows NT®® Service (RPCSS.EXE) Service (RPCSS.EXE)
![Page 10: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/10.jpg)
The COM Runtime EnvironmentThe COM Runtime Environment
OLE32.DLLOLE32.DLL
RPCSS.EXERPCSS.EXE
Foo.dllFoo.dll
OLE32.DLLOLE32.DLL
Bar.exeBar.exe
RPCSS.EXERPCSS.EXE
OLE32.DLLOLE32.DLL
Bar.exeBar.exe
![Page 11: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/11.jpg)
COM Class LoadingCOM Class Loading Clients issue activation Clients issue activation calls againstcalls against
the SCMthe SCM SCM responsible for locating component and SCM responsible for locating component and
loading it into memoryloading it into memory SCM queries component for class object SCM queries component for class object
and (optionally) uses it to instantiate and (optionally) uses it to instantiate new instancenew instance
Once SCM returns a reference to class Once SCM returns a reference to class instance/class object, SCM out of the pictureinstance/class object, SCM out of the picture
Based on configuration, COM may need to Based on configuration, COM may need to load component in separate process load component in separate process (potentially on different machine)(potentially on different machine)
![Page 12: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/12.jpg)
COM Class Loading And LocalityCOM Class Loading And Locality
All activation calls allow client to indicate localityAll activation calls allow client to indicate locality– SCM chooses most efficient allowed by client
typedef struct _COSERVERINFO {typedef struct _COSERVERINFO { DWORD dwReserved1; // m.b.z.DWORD dwReserved1; // m.b.z. const OLECHAR *pwszName; // host nameconst OLECHAR *pwszName; // host name COAUTHINFO *pAuthInfo; // security gooCOAUTHINFO *pAuthInfo; // security goo DWORD dwReserved2; // m.b.z.DWORD dwReserved2; // m.b.z.} COSERVERINFO;} COSERVERINFO;
CLSCTX_INPROC_SERVER // load in client processCLSCTX_INPROC_SERVER // load in client processCLSCTX_INPROC_HANDLER // use OLE Document rendering handlerCLSCTX_INPROC_HANDLER // use OLE Document rendering handlerCLSCTX_LOCAL_SERVER // load in separate processCLSCTX_LOCAL_SERVER // load in separate processCLSCTX_REMOTE_SERVER // load on distinct host machineCLSCTX_REMOTE_SERVER // load on distinct host machineCLSCTX_SERVER CLSCTX_SERVER // CLSCTX_*_SERVER// CLSCTX_*_SERVERCLSCTX_ALL CLSCTX_ALL // CLSCTX_*// CLSCTX_*
![Page 13: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/13.jpg)
Using The SCMUsing The SCM The SCM exposes two core activation APIsThe SCM exposes two core activation APIs Both APIs load component automaticallyBoth APIs load component automatically Both APIs accept a CLSID and information Both APIs accept a CLSID and information
about component location as input about component location as input parametersparameters
CoGetClassObject returns class CoGetClassObject returns class object/factoryobject/factory– No new instances created
CoCreateInstanceEx uses IClassFactory CoCreateInstanceEx uses IClassFactory interface on class object to create new interface on class object to create new instanceinstance– Class object never returned to client
![Page 14: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/14.jpg)
CoGetClassObject/IClassFactoryCoGetClassObject/IClassFactory
HRESULT HRESULT CoGetClassObjectCoGetClassObject(( [in] const CLSID& [in] const CLSID& rclsidrclsid, // which class?, // which class? [in] DWORD dwClsCtx, // locality?[in] DWORD dwClsCtx, // locality? [in] COSERVERINFO *pcsi, // host/sec info?[in] COSERVERINFO *pcsi, // host/sec info? [in] REFIID riid, // which interface?[in] REFIID riid, // which interface? [out, iid_is(riid)] void **ppv // put it here![out, iid_is(riid)] void **ppv // put it here!););
interface IClassFactory : IUnknown {// create a new com object HRESULT CreateInstance([in] IUnknown *pUnkOuter, [in] REFIID riid, [out,retval,iid_is(riid)] void **ppv);// hold component code in memory HRESULT LockServer([in] BOOL bLock);}
![Page 15: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/15.jpg)
ExampleExample
void CreatePager(IPager *&rpp, IMessageSource *&rpms) { IClassFactory *pcf = 0; rpp = 0; rpms = 0;// ask SCM to load class code for Pager HRESULT hr = CoGetClassObject(CLSID_Pager, CLSCTX_ALL, 0, IID_IClassFactory, (void**)&pcf); if (SUCCEEDED(hr)) {// ask class code to create new class instance hr = pcf->CreateInstance(0, IID_IPager, (void**)&rpp); if (SUCCEEDED(hr)) hr = rpp->QueryInterface(IID_IMessageSource, (void**)&rpms); pcf->Release(); }}
![Page 16: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/16.jpg)
ExampleExamplemobile.dllmobile.dll
Client calls CoGetClassObjectClient calls CoGetClassObject11
11
rpprpp
pcfpcf
Client.exeClient.exe
Client calls CreateInstance on Class ObjectClient calls CreateInstance on Class Object22
22
Client calls Release on Class ObjectClient calls Release on Class Object44
44
rpmsrpms
Client calls QueryInterface on Class InstanceClient calls QueryInterface on Class Instance33
33
![Page 17: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/17.jpg)
CoGetClassObject PitfallsCoGetClassObject PitfallsPrevious example made at least four Previous example made at least four
round-trips in distributed caseround-trips in distributed case– One for CoGetClassObject– One for CreateInstance– One for QueryInterface– One for IClassFactory::Release
Superior solution would perform class Superior solution would perform class loading and object creation in one round loading and object creation in one round triptrip
Solution: CoCreateInstance[Ex]Solution: CoCreateInstance[Ex]
![Page 18: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/18.jpg)
CoCreateInstanceExCoCreateInstanceEx
HRESULT CoCreateInstanceEx( [in] const CLSID& rclsid, // which class? [in] IUnknown *pUnkOuter, // used in aggregation [in] DWORD dwClsCtx, // locality [in] COSERVERINFO *pcsi, // (opt) host/sec. info [in] ULONG cItfs, // # of interfaces[in, out] MULTI_QI *prgmqi // put them here! );
typedef struct { const IID *pIID; IUnknown *pItf; HRESULT hr;} MULTI_QI;
HRESULT CoCreateInstance( [in] const CLSID& rclsid, // which class? [in] IUnknown *pUnkOuter, // used in aggregation [in] DWORD dwClsCtx, // locality? [in] REFIID riid, // which interface?[out, iid_is(riid)] void **ppv // put it here! );
![Page 19: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/19.jpg)
ExampleExamplevoid CreatePager(IPager *&rpp, IMessageSource *&rpms) { rpp = 0; rpms = 0;// build vector of interface requests MULTI_QI rgmqi[] = { { &IID_IPager, 0, 0 }, { &IID_IMessageSource, 0, 0 } };// ask COM to load class code and create instance HRESULT hr = CoCreateInstanceEx(CLSID_Pager, 0, CLSCTX_ALL, 0, 2, rgmqi);// extract interface pointers from rgmqi vector if (SUCCEEDED(hr)) { if (hr == S_OK || SUCCEEDED(rgmqi[0].hr)) rpp = reinterpret_cast<IPager*>(rgmqi[0].pItf); if (hr == S_OK || SUCCEEDED(rgmqi[1].hr)) rpms =reinterpret_cast<IMessageSource*>(rgmqi[1].pItf); }}
![Page 20: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/20.jpg)
Exposing COM ClassesExposing COM Classes Component DLLs export a well-known Component DLLs export a well-known
function used by COM to extract class object function used by COM to extract class object from DLLfrom DLL
STDAPI DllGetClassObject( [in] REFCLSID rclsid, // which class? [in] REFIID riid, // which interface? [out, iid_is(riid)] void **ppv // put it here!);
DllGetClassObject called by DllGetClassObject called by CoGetClassObject and CoCreateInstance[Ex] CoGetClassObject and CoCreateInstance[Ex] to access class objectto access class object– Never called directly by client code
If DLL doesn’t export DllGetClassObject, If DLL doesn’t export DllGetClassObject, all activation calls will failall activation calls will fail
![Page 21: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/21.jpg)
DllGetClassObjectDllGetClassObject
PagerPagerClass ObjectClass Object
IClassFactoryIClassFactory
DllGetClassObjectDllGetClassObject
COMCOM
CoCreateInstanceExCoCreateInstanceEx
PagerPagerClass InstanceClass Instance
IPagerIPager
IMessageSourceIMessageSource
ICF::CreateInstanceICF::CreateInstance
PagerPagerClass InstanceClass Instance
IPagerIPager
IMessageSourceIMessageSource
CellPhoneCellPhoneClass InstanceClass Instance
ICellPhoneICellPhone
IMessageSourceIMessageSourceCellPhoneCellPhone
Class ObjectClass ObjectIClassFactoryIClassFactory
![Page 22: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/22.jpg)
Exposing Class Objects/InprocExposing Class Objects/Inproc
PagerClassObject g_coPager;CellPhoneClassObject g_coCellPhone;
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void**ppv) { if (rclsid == CLSID_Pager) return g_coPager.QueryInterface(riid, ppv); else if (rclsid == CLSID_CellPhone) return g_coCellPhone.QueryInterface(riid, ppv); *ppv = 0; return CLASS_E_CLASSNOTAVAILABLE;}
![Page 23: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/23.jpg)
Finding ComponentsFinding Components All COM classes registered under distinguished key All COM classes registered under distinguished key
in registry (HKEY_CLASSES_ROOT)in registry (HKEY_CLASSES_ROOT)– Holds machine-wide configuration under Windows NT 4.0– Magic key under W2K that merges machine-wide registration
with current user’s private configuration Can also register text-based aliases for CLSIDs Can also register text-based aliases for CLSIDs
called called ProgIDsProgIDs for GUID-hostile environments for GUID-hostile environments REGSVR32.EXE used to install component DLLs that REGSVR32.EXE used to install component DLLs that
export two well-known entry pointsexport two well-known entry points– STDAPI DllRegisterServer(void);– STDAPI DllUnregisterServer(void);
![Page 24: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/24.jpg)
CLSID And The RegistryCLSID And The RegistryHKEY_CLASSES_ROOTHKEY_CLASSES_ROOT
CLSIDCLSID
@=Pager@=Pager
InprocServer32InprocServer32
@=C:\bin\mobile.dll@=C:\bin\mobile.dll
@=CellPhone@=CellPhone
InprocServer32InprocServer32
@=C:\bin\mobile.dll@=C:\bin\mobile.dll
{CLSID_CellPhone}{CLSID_CellPhone}{CLSID_Pager}{CLSID_Pager}
LocalServer32LocalServer32
@=C:\bin\phones.exe@=C:\bin\phones.exe
![Page 25: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/25.jpg)
ProgIds And The RegistryProgIds And The RegistryHKEY_CLASSES_ROOTHKEY_CLASSES_ROOT
CLSIDCLSID
@=Pager@=Pager
ProgIDProgID
@=Commlib.Pager.1@=Commlib.Pager.1
{CLSID_Pager}
InprocServer32InprocServer32
@=C:\bin\mobile.dll@=C:\bin\mobile.dll
Commlib.Pager.1Commlib.Pager.1
@=Pager@=Pager
CLSIDCLSID
@={CLSID_Pager}@={CLSID_Pager}
HRESULT ProgIDFromCLSID(HRESULT ProgIDFromCLSID( [in] REFCLSID rclsid,[in] REFCLSID rclsid, [out] OLECHAR **ppwszProgID);[out] OLECHAR **ppwszProgID);HRESULT CLSIDFromProgID(HRESULT CLSIDFromProgID( [in] OLECHAR *pwszProgID,[in] OLECHAR *pwszProgID, [out] CLSID *pclsid);[out] CLSID *pclsid);
![Page 26: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/26.jpg)
COM Classes And IDLCOM Classes And IDL COM classes can be declared in IDL using coclass COM classes can be declared in IDL using coclass
statementstatement Coclass statement generates class entry in TLBCoclass statement generates class entry in TLB Coclass statement generates CLSID_XXX variables Coclass statement generates CLSID_XXX variables
in generated C(++) headersin generated C(++) headers– Generates __declspec(uuid) statements as well
Coclass statement allows mimimum supported interfaces Coclass statement allows mimimum supported interfaces to be listed as wellto be listed as well
[ uuid(03C20B33-C942-11d1-926D-006008026FEA) ][ uuid(03C20B33-C942-11d1-926D-006008026FEA) ]coclass Pager {coclass Pager { [default] interface IPager;[default] interface IPager; interface IMessageSource;interface IMessageSource;}}
Async Calls
![Page 27: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/27.jpg)
InterceptionInterception In general, it is better to leverage platform In general, it is better to leverage platform
code than to write it yourselfcode than to write it yourself– Thread scheduler, file system, window manager
Classically, the platform has been exposed Classically, the platform has been exposed through explicit APIs and interfacesthrough explicit APIs and interfaces– Requires some code on your part to utilize
COM is moving towards exposing the COM is moving towards exposing the platform through interceptionplatform through interception– COM puts a middleman between the client
and object– Middleman makes calls to the platform on object’s
behalf both before and after object’s method executes
![Page 28: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/28.jpg)
Interception BasicsInterception Basics
To provide a service, the system must intercept all To provide a service, the system must intercept all calls to your objectcalls to your object
Interceptors pre- and post-process every callInterceptors pre- and post-process every call– Interceptors make system calls on your behalf– Interceptors set up the runtime environment for your method
calls– Interceptors may fail the method call without your
participation Interceptors must know what your interfaces Interceptors must know what your interfaces
look likelook like– All interfaces exposed by configured components require
specially prepared P/S DLL or a type library
![Page 29: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/29.jpg)
Interception And InterfacesInterception And Interfaces
Interception needs type info for all interfacesInterception needs type info for all interfaces Interfaces marked [dual] and [oleautomation] can Interfaces marked [dual] and [oleautomation] can
simply rely on type librarysimply rely on type library– Parameter types limited to VARIANT-compatible
Interfaces not marked [dual] or [oleautomation] Interfaces not marked [dual] or [oleautomation] require a specially prepared proxy/stub DLLs require a specially prepared proxy/stub DLLs – Run MIDL compiler using /Oicf flag– Compile foo_i.c, foo_p.c and dllhost.c using /MD switch– Link P/S dll against MTXIH.LIB, OLE32.LIB and
ADVAPI32.LIB before any other libraries Registering P/S DLL or (dual/oleautomation) TLB Registering P/S DLL or (dual/oleautomation) TLB
inserts entries under HKCR\Interfacesinserts entries under HKCR\Interfaces
![Page 30: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/30.jpg)
Proxy/Stub Dlls And Proxy/Stub Dlls And The RegistryThe Registry
HKEY_CLASSES_ROOTHKEY_CLASSES_ROOT
CLSIDCLSID
@=PSFactoryBuffer@=PSFactoryBuffer
InprocServer32InprocServer32
@=C:\bin\cmps.dll@=C:\bin\cmps.dll
@=IPager@=IPager
ProxyStubClsid32ProxyStubClsid32
@={CLSID_PSComm}@={CLSID_PSComm}
{IID_IPager}{IID_IPager}{CLSID_PSComm}{CLSID_PSComm}
InterfaceInterface
@=IMessageSource@=IMessageSource
ProxyStubClsid32ProxyStubClsid32
@={CLSID_PSComm}@={CLSID_PSComm}
{IID_IMessageSource}{IID_IMessageSource}
ThreadingModel=bothThreadingModel=both
![Page 31: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/31.jpg)
Configured ComponentsConfigured Components
ProblemProblem: If goal is to write little or no code, how do we : If goal is to write little or no code, how do we configure interceptor to do its magic?configure interceptor to do its magic?
SolutionSolution: Declarative attributes: Declarative attributes Classes that require extended services must indicate Classes that require extended services must indicate
this this declarativelydeclaratively COM+/MTS introduce the notion COM+/MTS introduce the notion
of of configured componentsconfigured components Configured components are classes that have extended Configured components are classes that have extended
attributes that control interceptionattributes that control interception Configured components always DLLsConfigured components always DLLs
– MTS/COM+ use surrogate for remote/local activation
![Page 32: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/32.jpg)
Configured ComponentsConfigured Components MTS and COM+ have radically different MTS and COM+ have radically different
details wrt how configuration information details wrt how configuration information is stored and usedis stored and used
Both use HKEY_CLASSES_ROOT\CLSIDBoth use HKEY_CLASSES_ROOT\CLSID Both store information in auxiliary storageBoth store information in auxiliary storage Details abstracted away behind Details abstracted away behind
catalog managercatalog manager
CatalogCatalogManagerManager
HKEY_CLASSES_ROOT\CLSIDHKEY_CLASSES_ROOT\CLSID
Auxiliary Configuration DatabaseAuxiliary Configuration Database
![Page 33: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/33.jpg)
Configured Components - MTS StyleConfigured Components - MTS Style
MTS layers on top of classic COMMTS layers on top of classic COM Runtime services provided by MTS executiveRuntime services provided by MTS executive
– Lives in MTXEX.DLL MTS CatMan stores MTXEX.DLL under HKCR to ensure MTS CatMan stores MTXEX.DLL under HKCR to ensure
MTS gets between client and objectMTS gets between client and object– Stores component filename in aux database
CatalogCatalogManagerManager
HKEY_CLASSES_ROOT\CLSIDHKEY_CLASSES_ROOT\CLSIDInprocServer32=MTXEX.DLLInprocServer32=MTXEX.DLL
Auxiliary Configuration DatabaseAuxiliary Configuration DatabaseCLSID_Pager=PAGER.DLLCLSID_Pager=PAGER.DLL
![Page 34: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/34.jpg)
Configured Components - COM+ StyleConfigured Components - COM+ Style
Under COM+, runtime services provided Under COM+, runtime services provided by COM itselfby COM itself
CoCreateInstance is smart enough to consult auxiliary CoCreateInstance is smart enough to consult auxiliary information at activation-timeinformation at activation-time
COM+ CatMan stores still manages extended attributes in COM+ CatMan stores still manages extended attributes in auxiliary databaseauxiliary database
CatalogCatalogManagerManager
HKEY_CLASSES_ROOT\CLSIDHKEY_CLASSES_ROOT\CLSIDInprocServer32=PAGER.DLLInprocServer32=PAGER.DLL
Auxiliary Configuration DatabaseAuxiliary Configuration DatabaseCLSID_Pager=LoadBalance+PoolingCLSID_Pager=LoadBalance+Pooling
![Page 35: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/35.jpg)
Packages/ApplicationsPackages/Applications The catalog manager segregates classes into The catalog manager segregates classes into
COM+ applications (or MTS packages)COM+ applications (or MTS packages) Each configured class belongs to exactly one Each configured class belongs to exactly one
applicationapplication All classes in an application share All classes in an application share
activation settingsactivation settings Configuration orthogonal to physical Configuration orthogonal to physical
packagingpackaging– x classes from y DLLs mapped into z applications
Applications can be configured to load in Applications can be configured to load in activator’s process (library) or in distinct activator’s process (library) or in distinct surrogate process (server)surrogate process (server)
![Page 36: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/36.jpg)
xx Classes, Classes, yy Dlls, Dlls, z z Applications/PackagesApplications/Packages
OneAndTwo.dllOneAndTwo.dll
OneOneTwoTwo
OneAndFour ApplicationOneAndFour Application TwoAndThree ApplicationTwoAndThree Application
OneTwo
DLLsDLLs
Packages/AppsPackages/Apps
ThreeAndFour.dllThreeAndFour.dll
ThreeThree
FourFour
FourThree
![Page 37: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/37.jpg)
AttributesAttributes
The catalog stores attributes that the runtime The catalog stores attributes that the runtime interrogates to build an interceptorinterrogates to build an interceptor
The set of attributes is fixed (for now)The set of attributes is fixed (for now) Applications/packages, classes, interfaces Applications/packages, classes, interfaces
and methods can all have attributesand methods can all have attributes Can set attributes using Can set attributes using
COM+/MTS explorerCOM+/MTS explorer Will be able to set all attributes from Will be able to set all attributes from
development environment someday…development environment someday…
![Page 38: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/38.jpg)
Attributes: Applications/PackagesAttributes: Applications/Packages
ImpersonationImpersonationLevelLevel
ProcessProcessShutdownShutdown
DebuggerDebugger
Enable CompensatingEnable CompensatingResource ManagersResource Managers
Enable 3GBEnable 3GBSupportSupport
SecuritySecurityIdentityIdentity
QueueingQueueing
IdentifyIdentify, Impersonate, Delegate, Impersonate, Delegate
NeverNever//N minutes after idleN minutes after idle
Command Line to Launch Debugger/ProcessCommand Line to Launch Debugger/Process
On/On/OffOff
On/On/OffOff
Interactive UserInteractive User//Hardcoded User ID + PWHardcoded User ID + PW
Queued/Queued+ListenerQueued/Queued+Listener
AuthenticationAuthenticationLevelLevel NoneNone, , ConnectConnect, , CallCall, , PacketPacket, , IntegrityIntegrity, , PrivacyPrivacy
AuthorizationAuthorizationChecksChecks Application OnlyApplication Only//Application + ComponentApplication + Component
ActivationActivationTypeType Library (inproc)/Server (surrogate)Library (inproc)/Server (surrogate)
Underlines indicate settings available under MTSUnderlines indicate settings available under MTS
![Page 39: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/39.jpg)
Attributes: Classes, Interfaces, Attributes: Classes, Interfaces, And MethodsAnd MethodsTransactionTransaction
SynchronizationSynchronization
Object PoolingObject Pooling
Declarative Declarative ConstructionConstruction
JIT ActivationJIT Activation
Activation-time Activation-time Load BalancingLoad BalancingInstrumentationInstrumentation
EventsEventsDeclarativeDeclarative
AuthorizationAuthorization
Non SupportedNon Supported, , SupportedSupported, , RequiredRequired, , Requires NewRequires New
Non Supported, Supported, Non Supported, Supported, RequiredRequired, Requires New, Requires New
On/On/OffOff, Max Instances, Min Instances, Timeout, Max Instances, Min Instances, Timeout
Arbitrary Class-specific StringArbitrary Class-specific String
OnOn/Off/Off
On/On/OffOff
OnOn/Off/Off
Zero or more role namesZero or more role names
Auto-DeactivateAuto-Deactivate On/On/OffOff
ClassClass
ClassClass
ClassClass
ClassClass
ClassClass
ClassClass
ClassClassClassClass
InterfaceInterfaceMethodMethod
MethodMethod
Must Activate inMust Activate inActivator’s ContextActivator’s Context On/On/OffOff ClassClass
Underlines indicate settings available under MTSUnderlines indicate settings available under MTS
![Page 40: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/40.jpg)
Exporting Packages/ ApplicationsExporting Packages/ Applications
MTS/COM+ allow package/app configuration to be MTS/COM+ allow package/app configuration to be exported to the file system for distributionexported to the file system for distribution
MTS: Exporting produces a .PAK file that contains MTS: Exporting produces a .PAK file that contains snapshot of catalog for the packagesnapshot of catalog for the package– Also contains flattened references to all DLLs/TLBs
COM+: Exporting produces a single .MSI file that COM+: Exporting produces a single .MSI file that contains both catalog info and DLL/TLBscontains both catalog info and DLL/TLBs
.PAK/.MSI file can be imported on other host machines.PAK/.MSI file can be imported on other host machines– Can be done remotely using remote catalog access
![Page 41: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/41.jpg)
Package/Application Export ResiduePackage/Application Export Residue
MYAPP.MSIMYAPP.MSI
Catalog infoCatalog info
MYCOMP1.DLLMYCOMP1.DLL
code for some classescode for some classes
MYCOMP2.DLLMYCOMP2.DLL
code for other classescode for other classes
MYPS.DLLMYPS.DLL
proxy/stub codeproxy/stub code
MYAPP.PAKMYAPP.PAK
Catalog infoCatalog info
MYCOMP1.DLLMYCOMP1.DLL
code for some classescode for some classes
MYCOMP2.DLLMYCOMP2.DLL
code for other classescode for other classes
MYPS.DLLMYPS.DLL
proxy/stub codeproxy/stub code
MTSMTS COM+COM+
![Page 42: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/42.jpg)
Server Packages/ ApplicationsServer Packages/ Applications
An application can be configured to activate An application can be configured to activate as a library application or a server applicationas a library application or a server application– Server applications are the norm in MTS/COM+
Only server applications support…Only server applications support…– Remote activation– Complete Security Support– Insulating user of component from component faults
MTS Server packages are loaded by the MTS Surrogate MTS Server packages are loaded by the MTS Surrogate (mtx.exe)(mtx.exe)
COM+ Server packages are loaded by default COM COM+ Server packages are loaded by default COM surrogate (dllhost.exe)surrogate (dllhost.exe)– dllhst3g.exe if 3GB support is enabled in catalog
emtsonlyemtsonly
![Page 43: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/43.jpg)
MTS Server PackagesMTS Server Packages
You
CLIENT.EXECLIENT.EXE MTX.EXEMTX.EXE
OLE32.DLLOLE32.DLL
MTXEX.DLLMTXEX.DLL
YOURSERVER.DLLYOURSERVER.DLL
InterceptorInterceptor
YouYou
OLE32.DLLOLE32.DLL
ProxyProxy
emtsonlyemtsonly
![Page 44: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/44.jpg)
COM+ Server ApplicationsCOM+ Server Applications
YouYou
CLIENT.EXECLIENT.EXE DLLHOST.EXEDLLHOST.EXE
OLE32.DLLOLE32.DLL
YOURSERVER.DLLYOURSERVER.DLL
Stub(+)Stub(+)
YouYou
OLE32.DLLOLE32.DLL
ProxyProxy
emtsonlyemtsonly
![Page 45: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/45.jpg)
Library Applications/PackagesLibrary Applications/Packages
Library applications/packages load in the creator’s Library applications/packages load in the creator’s processprocess– Solves the “1 class used by 3 applications” problem
MTS catalog manager controls registry entries for MTS catalog manager controls registry entries for components in library packagescomponents in library packages– Each class’s InprocServer32 key points to the MTS Executive
(mtxex.dll)– MTS Executive creates interceptor between client and object
based on catalog info– MTS Executive manages a thread pool to service activation
calls and general housekeeping Instances will Instances will always alwaysalways always be protected from be protected from
concurrent access under MTS!concurrent access under MTS!
![Page 46: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/46.jpg)
CLIENT.EXECLIENT.EXE
MTS Library Packages MTS Library Packages In NatureIn Nature
OLE32.DLLOLE32.DLL
MTXEX.DLLMTXEX.DLL
YOURSERVER.DLLYOURSERVER.DLL
InterceptorInterceptor
YouYou
![Page 47: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/47.jpg)
How COM(+) Library Applications How COM(+) Library Applications WorkWork COM+ catalog manager leaves InprocServer32 COM+ catalog manager leaves InprocServer32
entry aloneentry alone– Additional attributes stored
in aux config database CoCreateInstance checks for extended CoCreateInstance checks for extended
attributes and creates an interceptor as attributes and creates an interceptor as neededneeded
Instances may or may not be protected from Instances may or may not be protected from concurrent access depending on concurrent access depending on configuration!configuration!– Default setting at install-time is protected, but can
easily defeat using COM+ Explorer
![Page 48: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/48.jpg)
CLIENT.EXECLIENT.EXE
COM+ Library Applications COM+ Library Applications In NatureIn Nature
OLE32.DLLOLE32.DLL
YOURSERVER.DLLYOURSERVER.DLL
InterceptorInterceptor
YouYou
![Page 49: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/49.jpg)
SummarySummary
The SCM dynamically loads COM class codeThe SCM dynamically loads COM class code COM+ and MTS exposes services through COM+ and MTS exposes services through
interceptioninterception Components configure their interceptors through Components configure their interceptors through
declarative attributes stored in a configuration declarative attributes stored in a configuration databasedatabase
MTS/COM+ consult configuration database at MTS/COM+ consult configuration database at activation timeactivation time
Classes are grouped into applications/packagesClasses are grouped into applications/packages The catalog is a scriptable MTS/COM+ componentThe catalog is a scriptable MTS/COM+ component
![Page 50: Fundamentals Of COM(+) (Part 2)](https://reader036.fdocuments.in/reader036/viewer/2022062310/56816860550346895ddeae88/html5/thumbnails/50.jpg)
ReferencesReferences Programming Dist Apps With Visual Basic Programming Dist Apps With Visual Basic
and COMand COM– Ted Pattison, Microsoft Press
Inside COMInside COM– Dale Rogerson, Microsoft Press
Essential COM(+), 2nd Edition (the book)Essential COM(+), 2nd Edition (the book)– Don Box, Addison Wesley Longman (4Q99)
Essential COM(+) Short Course, Essential COM(+) Short Course, DevelopMentorDevelopMentor– http://www.develop.com
DCOM Mailing ListDCOM Mailing List– http://discuss.microsoft.com