30
Arquitetura do DCOM Arquitetura do DCOM Alexandre Ricardo Nardi [email protected]

Arquitetura do DCOM Alexandre Ricardo Nardi [email protected]

Embed Size (px)

Citation preview

Page 1: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Arquitetura do DCOMArquitetura do DCOM

Alexandre Ricardo [email protected]

Page 2: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

ObjetivoObjetivo

Apresentar uma visão geral da infra-estrutura e funcionamento do COM/DCOM, sem entrar em detalhes sobre os serviços oferecidos, como de transações, chamadas assíncronas,...

Estabelecer parâmetros que possibilitem comparação com o CORBA, assunto do seminário “COM ou CORBA ?”

Page 3: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

RoteiroRoteiro Histórico Objetos X Componentes Fundamentos do COM/DCOM

– Interfaces– Acessando um objeto– Tipos de servidores– Proxies e Stubs– Marshaling– Criação de objetos– Destruição de objetos

Referências

Page 4: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

HistóricoHistórico 1988: Concepção do COM

– Influenciado por trabalhos prévios em Smalltalk, C++ e OSF Distributed Computing Environment (DCE)

1993: Primeira versão do COM, como parte do OLE 2.0 SDK

– Apenas comunicação local– 16-bit/single-threaded

1994: Lançamento do Windows NT 3.5

– Suporte para 32-bits + IDL 1995: Windows NT 3.51/Windows 95

– Pequenas melhorias, como suporte para ambiente multi-thread

1996: Windows NT 4.0– DCE-based Distributed COM (DCOM) protocol– Melhorias em segurança e threading

1996: Microsoft Transaction Server (MTS) 1.0

– Component-based Distributed Application Framework

1998: Windows NT 4.0 Option Pack– Microsoft Transaction Server 2.0– Microsoft Message Queue (MSMQ) 1.0– Internet Information Server 4.0

2000: Windows 2000– COM+, com a incorporação de diversos

serviços

Page 5: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

HistóricoHistórico

Microsoft Excel 2000

OBJECT

LINKINGDados permanecem no arquivo de origem

EMBEDDINGDados são copiados para o arquivo destino

X

Page 6: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

HistóricoHistórico

OLE– Visual Editing

OLE 2.0– Automation

ActiveX– ActiveX Controls– ActiveX Documents– ActiveX DLL e EXE

Windows DNA (Distributed interNet Applications Architecture)– Práticas de

programação recomendadas

Microsoft .NET– Em desenvolvimento

Page 7: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Objetos X ComponentesObjetos X Componentes

Objetos– Prioridade para

encapsulamento e reutilização de implementação através de herança

– Interfaces de objetos representam um contrato

Componentes– Prioridade para

conectividade (pluggability)

– É possível implementar um componente sem usar objetos!

– Encapsulamento é conseqüência

– Herança deveria ser resultado de bom design

Page 8: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

InterfacesInterfaces São contratos que descrevem as funcionalidades disponibilizadas pelos objetos do sistema

Definidas através da linguagem IDL (da Microsoft) – Interface Definition Language

Por vezes substituído por Type Libraries, arquivos compilados (binários) que contém uma descrição padronizada de um objeto COM. Muito utilizado por clientes VB – facilita a codificação, eliminando a necessidade de conhecer a estrutura da IDL. Entretanto, muitas vezes é necessário utilizar IDL

COM suporta herança (simples) de interfaces, mas não de implementação

Page 9: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

coclass CheckingAccount

Fundamentos do COM/DCOMFundamentos do COM/DCOMInterfaces – Um exemploInterfaces – Um exemplo

IAccountName Deposit(amount)

Balance Withdraw(amount)

IAccountInitInit(name)

ICheckingAccount:IAccountName Deposit(amount)

Balance Withdraw(amount)WithdrawUsingCheck(checkNumber, amount)

Page 10: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Interfaces - IDLInterfaces - IDLimport "oaidl.idl";import "ocidl.idl";

[ object, uuid(B5F3E2FE-B376-11D1-BB1E-00207812E629), oleautomation, helpstring("IAccount Interface"), pointer_default(unique) ] interface IAccount : IUnknown { [propget, helpstring("property Balance")] HRESULT Balance([out, retval] double *pVal);

[propget, helpstring("property Name")] HRESULT Name([out, retval] BSTR *pVal);

[helpstring("method Deposit")] HRESULT Deposit([in] double amount);

[helpstring("method Withdraw")] HRESULT Withdraw([in] double amount); };

[ object, uuid(B5F3E2FF-B376-11D1-BB1E-00207812E629), oleautomation, helpstring("IAccountInit Interface"), pointer_default(unique) ] interface IAccountInit : IUnknown { const int E_INVALID_NAME = 0x80040200;

[helpstring("method Init")] HRESULT Init([in] BSTR name); };

Page 11: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Interfaces - IDLInterfaces - IDL [ object, uuid(B5F3E2FD-B376-11D1-BB1E-00207812E629), oleautomation, helpstring("ICheckingAccount Interface"), pointer_default(unique) ] interface ICheckingAccount : IAccount { [helpstring("method WithdrawUsingCheck")] HRESULT WithdrawUsingCheck(

[in] long checkNumber, [in] double amount);

};

[ uuid(B5F3E2F0-B376-11D1-BB1E-00207812E629), version(1.0), helpstring("ComCppServer 1.0 Type Library")]library COMCPPSERVERLib{ importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(B5F3E300-B376-11D1-BB1E-00207812E629), helpstring("Ch3CheckingAccount Class") ] coclass CheckingAccount { interface IAccount; interface IAccountInit; [default] interface ICheckingAccount; };};

Page 12: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Interface IUnknownInterface IUnknown Deve ser implementada por todo objeto COM/DCOM Métodos:

– QueryInterface: retorna um ponteiro para uma interface– AddRef: quando um cliente recebe um interface pointer de

outro cliente, o primeiro deve chamar este método– Release: chamado por todo cliente, quando não precisar mais

do objeto

Page 13: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Interface IUnknown - ExemploInterface IUnknown - ExemploBOOL MyCheckingAccount::SetInterfaces( IUnknown* pIUnknown){ // Reset all interface pointers. Reset(); HRESULT hr; void* pInterface;

// Query the IUnknown interface to get the // ICheckingAccount interface. hr = pIUnknown->QueryInterface( IID_ICheckingAccount, &pInterface); m_pICheckingAccount = ( ICheckingAccount*) pInterface;

// Query the ICheckingAccount interface to get the // IAccount interface. hr = m_pICheckingAccount->QueryInterface( IID_IAccount, &pInterface); m_pIAccount = (IAccount*) pInterface;

// Query the IAccount interface to get the // IAccountInit interface. hr = m_pIAccount->QueryInterface( IID_IAccountInit, &pInterface); m_pIAccountInit = (IAccountInit*)pInterface;

return TRUE;}

Page 14: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Tipos de InterfacesTipos de InterfacesCustom Interfaces– COM IDL suporta o tratamento de tipos simples (int,

long,...) e complexos (arrays, structs,...)– Nem todo ambiente de desenvolvimento suporta tipos

complexos (VB, VJ++)– Custom interfaces são eficientes, tendo mapeamento

direto em vtables

Page 15: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Acessando um Objeto – Custom InterfaceAcessando um Objeto – Custom Interface

Cliente

Ponteiro para Método 1

Ponteiro para Método 2

Ponteiro para Método 3

Ponteiro para Método 4

Ponteiro para Método 5

Ponteiro para Método 6

QueryInterface() {...}

AddRef() {...}

Release() {...}

Depósito() {...}

Retirada() {...}

Transferência() {...}

vtable

IUnknown

Page 16: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Tipos de InterfacesTipos de InterfacesAutomation Interfaces– Implementação da interface IDispatch para suporte a

invocação dinâmica de métodos, comum em ambientes interpretados (VBScript, JScript)

– Suporte para automation types– Eficiência pelo menos 10x menor do que uso de custom

interfaces

Page 17: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Acessando um Objeto – Automation InterfaceAcessando um Objeto – Automation InterfaceCliente

Ponteiro para Método 1

Ponteiro para Método 2

Ponteiro para Método 3

Ponteiro para Método 4

Ponteiro para Método 5

Ponteiro para Método 6

Ponteiro para Método 7

QueryInterface() {...}

AddRef() {...}

Release() {...}

GetIDsOfNames() {...}

GetTypeInfo() {...}

GetTypeInfoCount() {...}

Invoke() {...}

Depósito() {...}

Retirada() {...}

Transferência() {...}

vtable

IUnknownIDispatch

Page 18: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Tipos de InterfacesTipos de InterfacesDual Interfaces

– Suporte para interfaces convencionais e de automação

– Limitação: deve utilizar apenas automation types

Page 19: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Acessando um Objeto – Dual InterfaceAcessando um Objeto – Dual Interface

Cliente

Ponteiro para Método 1

Ponteiro para Método 2

Ponteiro para Método 3

Ponteiro para Método 4

Ponteiro para Método 5

Ponteiro para Método 6

Ponteiro para Método 7

Ponteiro para Método 8

Ponteiro para Método 9

Ponteiro para Método 10

QueryInterface() {...}

AddRef() {...}

Release() {...}

GetIDsOfNames() {...}

GetTypeInfo() {...}

GetTypeInfoCount() {...}

Invoke() {...}

Depósito() {...}

Retirada() {...}

Transferência() {...}

vtable

IUnknownIDispatch

Page 20: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Tipos de Dados - AutomaçãoTipos de Dados - AutomaçãoCOM IDL Type Descriçãoshort inteiro de 16 bits com sinallong inteiro de 32 bits com sinalfloat número em ponto flutuante com 32 bitsdouble número em ponto flutuante com 64 bitsBSTR array com tamanho pré-fixado de caracteres de 2 bytesVARIANT_BOOL short integer used to indicate true or falseDATE double representando datasIUnknown* ponteiro genérico para interfaceIDispatch* ponteiro para interface de automaçãoVARIANT union de todos os tipos de automaçãoSAFEARRAY para gerenciar arrays multi-dimensionais de tamanho

variável

Page 21: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Computador XComputador XProcesso ClienteProcesso Cliente

AplicaçãoAplicaçãoClienteCliente Servidor in-Servidor in-

process (DLL)process (DLL)

Objeto in-Objeto in-processprocess

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Tipos de Tipos de

Servidores Servidores

Processo Servidor LocalProcesso Servidor Local

Servidor local Servidor local (out-of-process)(out-of-process)

Objeto Objeto LocalLocal

StubStub

RPCRPC

COMCOM

Proxy p/ Proxy p/ objeto objeto locallocal

COM

RPCRPC

Computador YComputador YDCOMDCOM

Proxy p/ Proxy p/ objeto objeto remotoremoto

Processo Servidor RemotoProcesso Servidor Remoto

Servidor remotoServidor remoto(out-of-process)(out-of-process)

Objeto Objeto RemotoRemoto

DDCOMCOM

StubStub

Page 22: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Proxies e StubsProxies e StubsCliente

Proxy(DLL gerada pelo MIDL)

COM/DCOM

Cliente

Proxy(oleaut32.dll)COM/DCOM

Type library(TLB geradapelo MIDL)

Servidor

Stub(DLL gerada pelo MIDL)

COM/DCOM

Servidor

Stub(oleaut32.dll)COM/DCOM

Type library(TLB geradapelo MIDL)

RPC

RPC

Page 23: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

MarshalingMarshalingTipo de interface cliente

Tipo de Marshaling

Custom interface Proxy/stub (DLL) deve ser registrada em cada computador cliente

Custom interface como [oleautomation]

Registrar type library ou registrar proxy/stub (DLL) em cada cliente

Automation interface IDispatch já está instalada (nada a fazer)

Dual interface Registrar type library ou registrar proxy/stub (DLL) em cada clienteNos clientes usando apenas IDispatch, nada a fazer

Page 24: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Cliente.EXE

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Criação de Objetos – Servidor In-ProcessCriação de Objetos – Servidor In-Process

OLE32.DLL CoGetClassObject CoLoadLibrary DLLGetClassObject

Service Control Manager (SCM)svchost.exe / rpcss.dll

RegDB{CLSID} - Servidor.DLL

invoca CoGetClassObjectinvoca Fac::CreateInstanceinvoca Obj::MeuMétodo

Servidor.DLL

Obj MeuObjetoMeuObjeto MeuMétodoMeuMétodo

Fac ClassFactoryClassFactory CreateInstanceCreateInstance

Page 25: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

RegDB{CLSID} - Servidor.EXE

Servidor.EXE

WinMain CoInitialize Cria e registra ClassFactory

Cliente.EXE

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Criação de Objetos – Servidor LocalCriação de Objetos – Servidor Local

OLE32.DLL CoGetClassObject

Service Control Manager (SCM)svchost.exe / rpcss.dll

invoca CoGetClassObjectinvoca Fac::CreateInstanceinvoca Obj::MeuMétodo

Obj MeuObjetoMeuObjeto MeuMétodoMeuMétodo

Fac ClassFactoryClassFactory CreateInstanceCreateInstance

CreateProcess

Proxy paraProxy paraServidor.EXEServidor.EXE

FacObj

Page 26: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Computador YComputador X

Servidor.EXE

WinMain CoInitialize Cria e registra ClassFactory

Cliente.EXE

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Criação de Objetos – Servidor RemotoCriação de Objetos – Servidor Remoto

OLE32.DLL CoGetClassObject

invoca CoGetClassObjectinvoca Fac::CreateInstanceinvoca Obj::MeuMétodo

Obj MeuObjetoMeuObjeto MeuMétodoMeuMétodo

Fac ClassFactoryClassFactory CreateInstanceCreateInstance

Proxy paraProxy paraServidor.EXEServidor.EXE

FacObj

SCMRegDB{AppID} – Computador Y

SCMCreateProcess

RegDB{CLSID} – Servidor.EXE

Page 27: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Criação de Objetos - ExemploCriação de Objetos - ExemploBOOL MyCheckingAccount::Init( const CString& name, const CString& serverName, CString& errmsg){ // Create server info. COSERVERINFO serverInfo; serverInfo.dwReserved1 = 0; serverInfo.dwReserved2 = 0; serverInfo.pwszName =

serverName.AllocSysString(); serverInfo.pAuthInfo = NULL;

// Get the factory ... IClassFactory* pICF; HRESULT hr;

hr = CoGetClassObject (CLSID_Ch3CheckingAccount, CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, &ServerInfo, IID_IClassFactory, (void**)&pICF); ::SysFreeString(serverInfo.pwszName);

// Create the instance ... IUnknown* pIUk; hr = pICF->CreateInstance(NULL,IID_IUnknown, (void**)&pIUk); pICF->Release(); // Set the interfaces with QueryInterface SetInterfaces(pIUk);

// Initialize the name. BSTR bstrName = name.AllocSysString(); hr = m_pIAccountInit->Init(bstrName); ::SysFreeString(bstrName);

return TRUE;}

Page 28: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM

Destruição de ObjetosDestruição de Objetos COM suporta contagem de referências e coleta de lixo

distribuídos Quando o cliente não mais necessitar de um objeto,

deve invocar o método IUnknown::Release, que decrementa o número de referências. Ao chegar a zero, o objeto é destruído

Em ambientes distribuídos há grande chance do cliente perder comunicação com o servidor: para isso são utilizadas estratégias como pinging/delta-pinging, otimizadas de modo a não haver degradação significativa de performance

Page 29: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

Fundamentos do COM/DCOM Fundamentos do COM/DCOM Destruição de Objetos - ExemploDestruição de Objetos - Exemplo

MyCheckingAccount::~MyCheckingAccount(){ Reset();}

void MyCheckingAccount::Reset(){ if (m_pIAccount) m_pIAccount->Release(); m_pIAccount = NULL;

if (m_pIAccountInit) m_pIAccountInit->Release(); m_pIAccountInit = NULL;

if (m_pICheckingAccount) m_pICheckingAccount->Release(); m_pICheckingAccount = NULL;}

Page 30: Arquitetura do DCOM Alexandre Ricardo Nardi nardi@ime.usp.br

ReferênciasReferências Jason Pritchard. COM and CORBA Side by Side (Addison-Wesley, 1999) Don Box. Essential COM (Addison-Wesley, 1998) Dale Rogerson. Inside COM (Microsoft Press, 1997) David Chappell. Understanding ActiveX and OLE (Microsoft Press,

1996) Microsoft Developer Network, em http : //

www.microsoft.com/msdn Alexandre Nardi. Curso “Organização e Desenvolvimento de Sistemas

Distribuídos Utilizando Windows DNA” (Microsoft/Opus Software, 2000)– Mary Kirtland. COM+ Internals.