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.
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).
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.
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:
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:
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
- Curso de dbExpress e DataSnap
- Curso de dbExpress e DataSnap - Parte II
- Curso de dbExpress e DataSnap - Parte III
- Curso de dbExpress e DataSnap - Parte IV
- Curso de dbExpress e DataSnap - Parte V
- Curso de dbExpress e DataSnap - Parte VI
- Curso de dbExpress e DataSnap - Parte VII
- Curso de dbExpress e DataSnap - Parte VIII
- Curso de dbExpress e DataSnap - Parte IX
- Curso de dbExpress e DataSnap - Parte X
- Curso de dbExpress e DataSnap - Parte XI
- Curso de dbExpress e DataSnap - Parte XII
- Curso de dbExpress e DataSnap - Parte XIII
- Curso de dbExpress e DataSnap - Parte XIV
- Curso de dbExpress e DataSnap - Parte XV
- Curso de dbExpress e DataSnap - Parte XVI
- Curso de dbExpress e DataSnap - Parte XVII
- Curso de dbExpress e DataSnap - Parte XVIII
- Curso de dbExpress e DataSnap - Parte XIX
- Curso de dbExpress e DataSnap - Parte XX
- Curso de dbExpress e DataSnap - Parte XXI
- Curso de dbExpress e DataSnap - Parte XXII
- Curso de dbExpress e DataSnap - Parte XXIII
- Curso de dbExpress e DataSnap - Parte XXIV
- Curso de dbExpress e DataSnap - Parte XXV
- Curso de dbExpress e DataSnap - Parte XXVI
- Curso de dbExpress e DataSnap - Parte XXVII
- Curso de dbExpress e DataSnap - Parte XXVIII
- Curso de dbExpress e DataSnap - Parte XXIX
- Curso de dbExpress e DataSnap - Parte XXX