Curso de dbExpress e DataSnap

Parte XX – Objetos COM

Neste artigo, veremos como criar e como usar objetos COM, um dos fundamentos mais básicos da programação de objetos distribuídos e DataSnap.

COM (Component Object Model) é a tecnologia desenhada pela Microsoft que possibilita a comunicação entre aplicações clientes e aplicações servidoras. Essa comunicação é feita através do que chamamos de interfaces. Uma interface COM é a maneira como um objeto expõe sua funcionalidade ao meio externo. Um GUID (Globally Unique Identifier) é um número utilizado no COM para identificar uma interface ou uma Co-Class. Quando utilizado para identificar uma interface, um GUID é também chamado de IID (interface ID).

Vamos então criar nosso primeiro objeto COM. Siga os seguintes passos: Clique em File|New|Other. Na guia ActiveX clique em ActiveX Library. Uma nova biblioteca será criada, que será a DLL que conterá nosso objeto COM. Salve esta biblioteca com o nome de “LibExemplo”.

Clique novamente em File|New|Other. Na guia ActiveX escolha agora COM Object.

image001.png 

Figura 1.

Na caixa de diálogo que aparece, digite “Soma” para o nome da classe. O Delphi automaticamente preenche o nome da interface a ser implementada (ISoma). Deixe a opção Multiple Instance como padrão para Instancing (isso fará com que uma nova instância de nosso objeto seja criada para cada aplicação cliente). Na opção Threading Model deixe o padrão Apartment (cada objeto COM é executado dentro de seu próprio Thread).

image003.png 

Figura 2.

Clique em OK. Aparecerá a Type Library do objeto COM. Salve a unidade criada com o nome de uSoma. Uma Type Library constitui a maneira de identificarmos os métodos suportados por uma interface. O Delphi oferece um editor onde se pode facilmente construir uma interface para um objeto e através de código Pascal implementar essa interface. Para visualizar o editor da Type Library de um objeto você pode acessar o menu View|Type Library.

No editor da Type Library, dê um clique de direita sobre a interface ISoma. Escolha New|Method. Dê o nome de “Somar” para o método. Em nosso primeiro exemplo, criaremos um função que receberá dois parâmetro Single, retornando a soma de ambos.

Na opção Return Type da guia Parameters, escolha Single. Clique em Add e insira dois parâmetros (“Num1” e “Num2”) do tipo Single. Salve tudo para o Delphi atualizar a unit de implementação. Tenha em mente que OLE e COM não oferecem suporte a todos os tipos de dados do Delphi.

image005.png 

Figura 3.

Clique agora em View|Units e escolha LibExemplo_TLB. Você verá uma extensa unidade Pascal que define a Type Library da interface criada. Logo no início há uma declaração avisando a você para não mudar este código fonte. Qualquer modificação neste código deve ser feita por meio do editor da Type Library.

Procure pela seguinte declaração:

 

ISoma = interface(IUnknown)

  ['{F1431B15-D645-4BC1-8F26-81B7BBF8D4C7}']

  function Somar(Num1: Single; Num2: Single): single; stdcall;

end;

 

Esta é a definição da nossa interface feita anteriormente no editor da Type Library. O que precisamos fazer agora é codificar o método Somar. Abra a unit uSoma e na seção implementation implemente a função (o Delphi já colocou os cabeçalhos).

 

function TSoma.Somar(Num1, Num2: Single): Single;

begin

  result:=Num1+Num2;

end;

 

Agora basta compilar a biblioteca. Clique em Project|Build LibExemplo. Clique em Run|Register ActiveX Server para registrar o objeto.

Vamos agora criar um cliente para nosso objeto COM criado anteriormente. Siga os passos abaixo: Clique em File|New Application. Salve a unit com o nome de “uClienteCOM.pas” e o projeto com o nome de “ClienteCOM.dpr”. Dê o nome de “FrmMain” e Caption “Objetos COM” ao formulário. Coloque um botão no formulário, com o Caption “Somar”, e três Edits. Veja a figura:

image007.png 

Figura 4.

O objetivo agora é clicar no botão e chamar a função Somar de nosso objeto COM, definido por nossa interface ISoma, implementada em nossa Co-Class TSoma. Para isso precisamos importar a Type Library do objeto que queremos instanciar.

Clique em Project|Add to Project e localize o arquivo LibExemploLib_TLB. Isso faz com que a Type Library da interface ISoma seja incorporada ao nosso aplicativo. Mas veja bem, apenas a interface do objeto será conhecida por nós, pois a sua implementação ficará oculta. Nós saberemos que ISoma possui o método Somar mas não sabemos como ela realiza o processamento internamente.

Agora no formulário principal clique em File|Use Unit e escolha LibExemplo_TLB. Faça o seguinte no evento OnClick do botão:

 

procedure TFrmMain.Button1Click(Sender: TObject);

var

  Obj : ISoma;

  n1,n2,n3 : single;

begin

  Obj:=CoSoma.Create;

  n1:=StrToInt(Edit1.Text);

  n2:=StrToInt(Edit2.Text);

  n3:=Obj.Somar(n1,n2);

  Edit3.text:=FloatToStr(n3);

end;

 

Execute e veja o resultado como na figura abaixo:

image009.png 

Figura 5.

Caso o servidor não tenha sido registrado uma exceção do tipo EOleSysError é levantada com a mensagem “Classe não registrada”.

 

Leia todos artigos da série