DCOM: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
SieBot (discussão | contribs)
m Bot: Adicionando: zh:Distributed COM
Leonardo.stabile (discussão | contribs)
Linha 1:
'''DCOM''' ('''''D'''istributed[[acrônimo]] '''c'''omponentpara '''o'''bjectDistributed Component Object Model'''m'''odel'') é uma tecnologia proprietária da [[Microsoft]] para criação de [[Componente de software|componentes de software]] distribuídos em computadores [[rede de computadores|interligados em rede]]. O DCOM é uma extensão do [[Component Object Model|COM]] (também da Microsoft) para a comunicação entre objetos em [[computação distribuída|sistemas distribuídos]]. A tecnologia DCOM foi substituída, na plataforma de desenvolvimento [[Microsoft .NET|.NET]], pela [[API]] [[.NET Remoting]].
 
O DCOM pode ser utilizado na construção de aplicações em 3três camadas, de forma a centralizar as regras de negócio e processos, obter escalabilidade e facilitar a manutenção.
 
==Arquitetura==
Linha 7:
 
===Visão geral===
Assim como feito no COM, a aplicação cliente cria objetos através de uma chamada à função <code>CoCreateInstance</code>, que utiliza o SCM (Service Control Manager). O SCM no computador cliente se comunica com o SCM no computador servidor, que utiliza a <code>CoCreateInstance</code> para criar o servidor COM desejado.
 
A aplicação cliente recebe um [[ponteiro (programação)|ponteiro]] para um objeto ''[[proxy]]'', que implementa a mesma [[interface]] do servidor COM e é responsável pela [[serialização]] dos parâmetros de entrada, pela utilização das funções do DCOM para comunicação com o computador servidor e pela "desserialização" dos parâmetros de saída.
O SCM no computador cliente se comunica com o SCM no computador servidor que utiliza a função CoCreateInstance para criar o servidor COM desejado.
 
A aplicação cliente recebe um ponteiro para um objeto ''[[proxy]]'', que implementa a mesma [[interface]] do servidor COM e é responsável pela [[serialização]] dos parâmetros de entrada, pela utilização das funções do DCOM para comunicação com o computador servidor e pela "desserialização" dos parâmetros de saída.
 
Um objeto ''[[stub]]'' é responsável por "desserializar" os parâmetros de entrada das chamadas de [[Método (programação)|métodos]] do servidor COM, por efetuar a chamada local, por serializar os parâmetros de saída e por utilizar as funções do DCOM para comunicação com o computador cliente.
 
O COM realiza a liberação de [[Memória (computador)|memória]] alocada não mais utilizada (''[[garbage collection]]'') através da [[contagem de referências]], com chamadas aos métodos <code>AddRef</code> e <code>Release</code> da interface <code>IUnknown</code>, implementada por todas as classes de objetos COM.
 
Para melhorar ao performancedesempenho da [[comunicação de dados|comunicação]] e suportar o término anormal de aplicações cliente, DCOM utiliza ''[[ping|pinging]]ing'' e o agrupamento de chamadas de contagem de referência.
 
===Localização de objetos===
Assim como no COM, cada [[classe (programação)|classe]] possui um [[identificador]] globalmenteglobal único (GUID) de 128 bits, chamado de Class ID (CLSID). A aplicação cliente informa o GUID do [[objeto]] desejado e, opcionalmente, o endereço do servidor que tem o [[executável|arquivo executável]] ou [[DLL]] e que será responsável pela sua execução. O SCM no computador cliente se conecta ao SCM no computador servidor, requisita a criação do objeto e retorna um [[ponteiro (programação)|ponteiro]] para um objeto ''proxy'' local, que implementa a mesma interface do objeto remoto, para a aplicação cliente. Caso a aplicação cliente não tenha informado o endereço do servidor, o SCM obtém essa informação no [[registro do [[Windows]].
 
===Chamada remota de métodos===
Quando a aplicação cliente chama um método do objeto remoto, o objeto ''proxy'' precisa efetuar a [[serialização]] (''marshaling'') dos parâmetros para que eles possam ser transmitidos pela rede. Os parâmetros podem ser tipos simples, mas também podem ser ''[[array|vetores]]s'' ou objetos complexos, compostos de vários objetos (inclusive com [[referência circular|referências circulares]]).
 
No servidor, um objeto ''proxy'' (chamado de ''stub'') realiza a "desserialização" (''unmarshaling'') dos parâmetros, chama o método do objeto, serializa os parâmetros de saída e transmite-os para o computador cliente. No cliente, o objeto proxy "desserializa" o retorno do método e repassa esses dados para a aplicação cliente. O mecanismo de serialização do DCOM foi construído a partir da infraestrutura de [[Chamadachamada de procedimento remoto|RPC]] (Remote Procedure Call) definida no padrão DCE ([[Distributed Computing Environment]] (DCE).
 
Se uma aplicação cliente (no computador A) realiza uma chamada remota a um método (de um objeto no computador B) que retorna um ponteiro para um objeto em execução em outro computador (C), após a desserialização a aplicação cliente pode chamar remotamente métodos do objeto no computador C.
pode chamar remotamente métodos do objeto no computador C.
 
===Gerência de Concorrênciaconcorrência===
Do ponto de vista do programador, a gerência de concorrência no DCOM funciona da mesma forma que o COM. Na opção ''Single-Threaded Apartment'' (STA) cada método de um objeto não recebe chamadas simultâneas, ou seja, cada objeto executa em uma ''[[Thread (ciência da computação)|thread]]''. No entanto, várias instâncias do objeto podem ser criadas para atender a requisições simultâneas. Na opção STA, ''main thread only'', todas as instâncias são criadas na mesma ''thread''. Na opção ''Multi-Threaded Apartment'' (MTA), um método pode receber várias chamadas ao mesmo tempo e deve ser codificado com a utilização de sincronização caso utilize algum recurso compartilhado, como um campo do objeto.
Do ponto de vista do programador, a gerência de concorrência no DCOM funciona da mesma forma que o COM.
Na opção Single-Threaded Apartment (STA) cada método de um objeto não recebe chamadas simultâneas, ou seja, cada objeto executa em uma thread. No entanto, várias instâncias do objeto podem ser criadas para atender a requisições simultâneas. Na opção STA, main thread only, todas as instâncias são criadas na mesma thread.
Na opção Multi-Threaded Apartment (MTA), um método pode receber várias chamadas ao mesmo tempo e deve ser codificado com a utilização de sincronização caso utilize algum recurso compartilhado, como um campo do objeto.
 
===Segurança===
O controle de acesso, que verifica se um usuário está autorizado a executar um método, pode ser configurado de forma declarativa ou ser embutido no código. O controle de criação de objetos somente pode ser feito de forma declarativa para evitar ataques de negação de serviço.
 
O DCOM fornece o serviço de autenticação de clientes. A autenticação pode ser configurada para funcionar com vários security providersfornecedores, dentre eles o Windows NT LAN Manager (NTLM). Na configuração padrão, a autenticação ocorre no estabelecimento da conexão. No entanto, ela pode ser configurada para ocorrer em cada chamada.
 
Para a restrição de acesso aos recursos gerenciados pelo [[sistema operacional]], o objeto remoto pode assumir a identidade do criador, o que pode ser útil quando o servidor é disponibilizado em uma rede local, ou uma identidade padrão, o que pode ser útil quando o servidor é disponibilizado na Internet. Clientes ou objetos podem requisitar que os pacotes de dados possuam informação adicional que garante integridade e criptografia dos pacotes.
 
Clientes ou objetos podem requisitar que os pacotes de dados possuam informação adicional que garante integridade e criptografia dos pacotes.
 
Como um servidor COM pode assumir a identidade do cliente, para prevenir o uso das credenciais do cliente por objetos programados de forma maliciosa, o cliente pode indicar se o objeto pode autenticá-lo e utilizar a sua identidade.
Linha 48 ⟶ 41:
===Pilha de comunicação utilizada pelo DCOM===
 
O protocolo do DCOM, chamado de ORPC (Object RPC), estende o protocolo DCE RPC. Os dados serializados nos pacotes ORPC são armazenados no formato Network Data Representation (NDR). O [[compilador]] de MIDL (Microsoft Interface Definition Language) é utilizado para a criação dos objetos proxy e stub, a partir da interface do servidor COM, que serializam e desserializam parâmetros e realizam a comunicação entre a aplicação cliente e o servidor COM.
 
Segundo [a documentação da Microsoft<ref>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndcom/html/msdn_dcomfirewall.asp]</ref>, DCOM utiliza [[User Datagram Protocol |UDP]] na comunicação entre duas máquinas com sistema operacional Windows NT 4 e TCP na comunicação entre duas máquinas com outros sistemas operacionais, como [[Windows 2000]], [[Windows 95]], [[Windows 98]] e [[UNIX]].
O compilador MSIDL (Microsoft Interface Definition Language) é utilizado para a criação dos objetos proxy e stub, a partir da interface do servidor COM, que serializam e desserializam parâmetros e realizam a comunicação entre a aplicação cliente e o servidor COM.
 
Segundo [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndcom/html/msdn_dcomfirewall.asp], DCOM utiliza [[User Datagram Protocol |UDP]] na comunicação entre duas máquinas com sistema operacional Windows NT 4 e TCP na comunicação entre duas máquinas com outros sistemas operacionais, como [[Windows 2000]], [[Windows 95]], [[Windows 98]] e [[UNIX]].
 
==Instalação e configuração de componentes remotos==
Linha 62 ⟶ 53:
 
==Utilitário DCOMCnfg==
O utilitário DCOMCnfg, que faz parte do Windows 2000 e pode ser instalado no Windows 95, permite a configuração de componentes remotos sem a edição direta do registro do Windows. O arquivo executável ou DLL com o componente remoto deve ser primeiramente registrado no computador cliente com a utilização de um dos seguintes comandos:
O arquivo executável ou DLL com o componente remoto deve ser primeiramente registrado no computador cliente com a utilização de um dos seguintes comandos:
 
regsvr32 <dll> <arquivo executável> /regserver
Linha 86 ⟶ 75:
Abaixo, segue o código fonte da aplicação cliente e do servidor COM, ambos escritos em Delphi:
 
<source lang="delphi">
unit unForm;
interface
Linha 128 ⟶ 118:
end;
end.
</source>
 
Servidor COM:
 
<source lang="delphi">
unit unServidorRelogio;
interface
Linha 150 ⟶ 142:
TTypedComObjectFactory.Create(ComServer, TServidorRelogio, Class_ServidorRelogio, ciMultiInstance, tmApartment);
end.
</source>
 
;Configuração:
 
Para a configuração do acesso ao servidor COM no computador cliente, foi criado um arquivo de alteração do registro do Windows. A seguir, o conteúdo do arquivo de configuração: