COM+

Criando e depurando um servidor de aplicações

 

Neste artigo veremos como criar e depurar um servidor COM+, usando o Delphi 7. Agradeço a sugestão enviada pelos leitores Anderson Marques Freria e Silfar Goulart.

Faremos aqui um exemplo bastante simples. Primeiro criaremos a aplicação servidora COM+, e a seguir uma aplicação cliente. As técnicas de depuração aqui apresentadas também podem ser aplicadas em projeto DataSnap, os passos são os mesmos.

Criando um exemplo simples

Antes de iniciar o exemplo clique em Tools|Environment Options>Type Library e na opção Language marque a opção Pascal:

 

Isso troca a linguagem padrão do editor da Type Library, facilitando nossa vida.

Clique em File|New>Other>ActiveX >Transactional Object.

 

Transactional Object é na verdade um objeto MTS / COM+.

Dê o nome de Teste para a CoClass:

 

CoClass é um objeto COM que implementa uma Type Library.

No editor da Type Librbary, clique de direita sobre a interface ITeste e escolha a opção New|Method. Aperte F2 e altere o nome do novo método para Somar.

 

Na aba Parameters clique no botão Add para adicionar dois parâmetros para o método, conforme mostrado na figura a seguir. Na opção Return Type coloque o tipo Integer:

 

Altere a implementação da no método na unit da CoClass conforme mostrado a seguir:

 

unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

 

interface

 

uses

ActiveX, Mtsobj, Mtx, ComObj, Project1_TLB, StdVcl;

 

type

TTeste = class(TMtsAutoObject, ITeste)

protected

function Somar(Num1, Num2: Integer): Integer; safecall;

 

end;

 

implementation

 

uses ComServ;

 

function TTeste.Somar(Num1, Num2: Integer): Integer;

begin

  result := Num1 + Num2;

end;

 

initialization

  TAutoObjectFactory.Create(ComServer, TTeste, Class_Teste,

  ciMultiInstance, tmApartment);

end.

 

Tudo o que fizemos aqui foi implementar o retorno do método Somar. Salve todos os arquivos do projeto em um diretório chamado “Server”.

Instalando e registrando o servidor COM+

Clique em Run|Install COM+ Object. Na caixa que aparece marque a opção Teste:

 

Na janela que aparece clique em Install into new Application, digitando “Teste” para o ApplicationName:

 

Clique em Ok e novamente em Ok. Com isso, o objeto já está registrado no catálogo do COM+, como você pode ver acessando o Painel de Controle>Ferramentas Administrativas>Serviços de componente:

 

Importando a Type Library do servidor e criando um “Wrapper”

Para acessar o servidor COM+, precisamos apenas de sua interface, ou seja, sua Type Library. O cliente não precisa saber detalhes sobre a implementação do objeto e onde é sua a localização física. Esse é um dos fundamentos da arquitetura de objetos distribuídos.

Clique em Project|Import Type Library e seleciona na lista nosso projeto servidor:

 

Observe a opção marcada por padrão logo abaixo da janela: Generate Component Wrapper. Isso irá gerar um componente Delphi (TComponent) que encapsulará a criação / acesso ao objeto servidor.

Clique em Install e na janela que aparece confirme que o componente será criado no pacote padrão do Delphi, clicando em Ok:

 

Na janela que aparece clique em No para que o pacote não seja recompilado ainda:

 

No editor do pacote, clique no botão Options. Vá até a guia Directories/Conditionals e digite as opções conforme mostrado a seguir:

 

Isso compila os arquivos do pacote no diretório Lib do Delphi, de forma que não precisaremos configurar um caminho no Library Path do Delphi (Lib já está adicionado por padrão).

Clique em OK e no editor clique em Install. Você deverá receber a seguinte mensagem, dizendo que o pacote foi instalado:

 

Observe que por padrão o componente é instalado na guia ActiveX:

 

Se você observar o pacote, verá que realmente ele encapsula a Type Library do servidor COM+ importada:

 

Criando a aplicação cliente

Inicie um nova aplicação no Delphi 7 (File|New Application). Salve todos os arquivos do projeto em um diretório chamado “Client”.

Coloque no formulário principal um componente Teste da paleta ActiveX. Coloque também três Edits e um Button, dispostos conforme mostrado na figura a seguir:

 

No evento OnClick do botão digite o seguinte:

 

procedure TForm1.Button1Click(Sender: TObject);

var

  Num1, Num2, Soma : Integer;

begin

  Num1 := StrToInt(Edit1.text);

  Num2 := StrToInt(Edit2.text);

  { Faz a chamada ao servidor COM + }

  Soma := Teste1.Somar(Num1,Num2);

  Edit3.Text:=InttoStr(Soma);

end;

 

Execute a aplicação e teste a soma:

 

Depurando o servidor COM+

A depuração de um servidor COM+ não é simples, visto que é uma DLL e aplicação cliente roda em outro processo, um executável, que se comunica por COM com o servidor.

O primeiro passo é reabrir o projeto servidor. Clique em Project Options e na aba Compiler desmarque a opção Optmization:

 

E na aba Linker marque as duas opções mostradas a seguir:

 

Clique em Ok e depois em Project|Build. Se você receber a mensagem de erro abaixo, provavelmente a DLL do servidor COM+ ainda está rodando (o Time-Out padrão é 3 min.)

 

Nesse caso, clique em Painel de Controle>Ferramentas Administrativas>Serviços de componente e dê um clique de direita sobre o pacote “Teste”, escolhendo a opção Desligar

 

Agora sim dê um Project|Build All. Clique em Run|Parameters e preencha as opções conforme mostrado a seguir:

 

O ProcessID passado como parâmetro para o dllhost e o GUID do pacote criado anteriormente no COM+. Você pode obter esse identificador clicando de direita sobre o pacote e escolhendo a opção Propriedades:

 

Copie o valor indicado na opção Identificação do Aplicativo:

 

Execute a aplicação. Será levantado o processo dllhost.exe hospedando nossa DLL.

Coloque um breakpoint no código que faz a soma, execute a aplicação cliente usando o Windows Explorer (não reabra a aplicação cliente no Delphi, mantenha o servidor em execução na IDE). Agora efetue uma soma. Quando o botão for clicado, será disparado o debugger do Delphi e você poderá depurar a aplicação servidor COM+ normalmente:

 

Um abraço a todos e até a próxima!