Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Pechinchando desde os primódios
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 







Pesquisa personalizada
Pesquisar Dicas:

 






Quer saber mais?
Não deixe escapar essa oportunidade!
::Treinamento para Certificação Microsoft - MCP::
::Treinamento para Certificação Microsoft - MCSD::
::Leia também o artigo:Conheça como funcionam as arquiteturas de desenvolvimento p/Web::

Simplificando o trabalho com o COM+

O controle de segurança no COM+ é apenas uma das configurações que pode se tornar um grande incômodo para a equipe de suporte que ficará responsável por ele.

O COM+ nos fornece uma biblioteca chamada COM+ Admin. Essa biblioteca nos permite manipular o COM+ por código e desta forma podemos criar uma interfaces um pouco mais amigáveis para a administração do COM+, permitindo até criar instaladores para nossa aplicação, ou coisa do gênero.

Mostrarei aqui apenas um pequeno exemplo, isso poderá ser bem melhorado por vocês.

Vamos considerar a seguinte interface gráfica :


Para iniciarmos a codificação o primeiro passo será fazermos references (project->references) para a biblioteca COM+ Admin Services.

Feito isso vamos programar o botão que terá que fazer a leitura de informações do servidor.

Neste botão será necessário ler as informações do COM+ e preenche-las no treeview. Observe que o COM+ tem uma organização hierárquica, deveremos então estar trabalhando isso.

Veja o código :

Dim Catalog As New COMAdminCatalog
     Dim NoSelecionado As MSComctlLib.Node
Private Sub cmdLerServidor_Click()
     Dim Applications As COMAdminCatalogCollection
     Dim Components As COMAdminCatalogCollection
     Dim AppObject As COMAdminCatalogObject
     Dim COMObject As COMAdminCatalogObject
     Dim Interf As COMAdminCatalogCollection
     Dim IntObject As COMAdminCatalogObject
     Dim Methods As COMAdminCatalogCollection
     Dim MetObject As COMAdminCatalogObject
     Dim icnt As Integer
'Iremos preencher a Treeview      até o nível de método, por isso a necessidade
     'desses objetos. Observem que se dividem em 2 tipos : Ou são objetos      Catalog
     'Collection, contendo vários objetos, ou são CatalogObject,      um objeto 
     'especifico
Catalog.Connect txtServidor.Text
     'Com isso fazemos a conexão ao servidor COM+. O catalog é um      objeto que foge
     'a regra : não é um object nem collection, ele é o ponto      inicial do modelo
     'de objetos do COM+

     'Obter uma coleção envolve 2 passos : Obter seu objeto e popula-lo.
     Set Applications = Catalog.GetCollection("Applications")
     Applications.Populate

     ' Como o que obtivemos foi a coleção de aplicações,      um for/each nessa 
     'coleção significa estarmos vasculhando os pacotes(aplicações)      contidos no
     'COM+
     For Each AppObject In Applications
'Adicionamos a aplicação      no Treeview. O name virá o key do treeview,
     ' Mas isso não é seguro, pois o COM+ permite em algumas situações
     ' dois pacotes com o mesmo nome
     TrvComponents.Nodes.Add , , AppObject.Name, AppObject.Name
'Para cada aplicação      precisamos navegar em sua coleção de componentes.
     'Aqui realizamos tarefa semelhante a anterior : Obtemos a coleção      de
     'Componentes e a populamos
     Set Components = Applications.GetCollection("Components", AppObject.Key)
     Components.Populate
'Vamos então navegar      na coleção de componentes de um pacote para poder
     'inseri-los no treeview
     For Each COMObject In Components
 'O próprio objeto      COM tem uma key que pode ser utilizada como chave
     'do treeview. Ele precisa também ser inserido como child de sua
     'aplicação
     TrvComponents.Nodes.Add AppObject.Name, tvwChild, COMObject.Key, COMObject.Name
 'Da mesma forma que antes,      passamos ao passo seguinte : Manipular a
     'Coleção de interfaces
     Set Interf = Components.GetCollection("InterfacesForComponent",      COMObject.Key)
     Interf.Populate
 'Fazemos um for/each      na coleção de interfaces para inseri-las no
     'treeview
     For Each IntObject In Interf
 'Aqui a interface é      adicionada ao treeview
     TrvComponents.Nodes.Add COMObject.Key, tvwChild, COMObject.Key + IntObject.Key,      IntObject.Name
 'Passamos enfim para      a última etapa, os métodos. O processo é o mesmo
     Set Methods = Interf.GetCollection("MethodsForInterface", IntObject.Key)
     Methods.Populate
     For Each MetObject In Methods
     TrvComponents.Nodes.Add COMObject.Key + IntObject.Key, tvwChild, IntObject.Key      & MetObject.Key & icnt, MetObject.Name
     icnt = icnt + 1
     Next
     Next
     Next
Next
End Sub
A idéia da aplicação é que quando o usuário clicar em um pacote as listbox serão preenchidas com os componentes e roles que o pacote contém. Então torna-se necessário programar o evento NodeClick da TreeView.
Private Sub TrvComponents_NodeClick(ByVal      Node As MSComctlLib.Node)
 If Node.Parent Is Nothing      Then
     PreencherComponentes Node
     PreencherRoles Node
     Set NoSelecionado = Node
 End If
End Sub


Como você pode observar, este evento depende de 2 subs : PreencherComponentes, que preenche a listbox de componentes e PreencherRoles, que preenche a listbox de roles.

Observe também que ao final da chamada das subs o Nó que encontra-se selecionado é guardado na variável NoSelecionado.

Veja como fica o PreencherComponentes :

Sub PreencherComponentes(ByVal      Node As MSComctlLib.Node)
     Dim Components As COMAdminCatalogCollection
     Dim COMObject As COMAdminCatalogObject
     Dim Applications As COMAdminCatalogCollection
     Dim AppObject As COMAdminCatalogObject
Set Applications = Catalog.GetCollection("Applications")
     Applications.Populate
For Each AppObject In      Applications
     If UCase(AppObject.Name) = UCase(Node.Text) Then
     Set Components = Applications.GetCollection("Components", AppObject.Key)
     Components.Populate
     lstComponentes.Clear
     
     For Each COMObject In Components
           lstComponentes.AddItem COMObject.Name
     Next
     Exit For
     End If
Next
End Sub

Resumindo : É feito um for/each para localizar a aplicação do COM+ que foi selecionada no treeview. No momento que esta é localizada é obtida a coleção components desta aplicação e feito um for/each para preencher a listbox com os componentes. Bem simples, apenas uma parte do que foi feito para preencher o TreeView.

Veja agora o PreencherRoles :

Sub PreencherRoles(ByVal      Node As MSComctlLib.Node)
     Dim Roles As COMAdminCatalogCollection
     Dim COMObject As COMAdminCatalogObject
     Dim Applications As COMAdminCatalogCollection
     Dim AppObject As COMAdminCatalogObject
Set Applications = Catalog.GetCollection("Applications")
     Applications.Populate
For Each AppObject In      Applications
     If UCase(AppObject.Name) = UCase(Node.Text) Then
     Set Roles = Applications.GetCollection("Roles", AppObject.Key)
     Roles.Populate
     lstRoles.Clear
     
     For Each COMObject In Roles
          lstRoles.AddItem COMObject.Name
     Next
     Exit For
     End If
Next
End Sub

É praticamente identico ao preencherComponentes, a única alteração é a coleção que é lida para preencher o listbox : É a coleção Roles e não a coleção Components.

Por fim, veja agora o código do botão atribuir :


     Private Sub cmdAtribuir_Click()
     Dim Components As COMAdminCatalogCollection
     Dim COMObject As COMAdminCatalogObject
     Dim Applications As COMAdminCatalogCollection
     Dim AppObject As COMAdminCatalogObject
     Dim RoleForComponent As COMAdminCatalogObject
     Dim RolesForComponent As COMAdminCatalogCollection
Dim icnt As Integer
     Dim icnt2 As Integer

     'Se não houver nenhum nó selecionado, nada deve ser feito
     If NoSelecionado Is Nothing Then
     MsgBox "Selecione um package primeiro!"
     Exit Sub
     End If

     Set Applications = Catalog.GetCollection("Applications")
     Applications.Populate
For Each AppObject In      Applications
     If UCase(AppObject.Name) = UCase(NoSelecionado.Text) Then
     Set Components = Applications.GetCollection("Components", AppObject.Key)
     Components.Populate
     
     For Each COMObject In Components
     If ComponenteEstaSelecionado(COMObject.Name) Then
     Set RolesForComponent = Components.GetCollection("RolesForComponent",      COMObject.Key)
     For icnt = 0 To lstRoles.ListCount - 1
     If lstRoles.Selected(icnt) Then
     Set RoleForComponent = RolesForComponent.Add
     RoleForComponent.Value("Name") = lstRoles.List(icnt)
     RolesForComponent.SaveChanges
     End If
     Next
     End If
     Next
     
     Exit For
     End If
Next
End Sub


Primeiramente é feito um For/Each na coleção Applications para localizar a aplicação em questão. Localizada a aplicação, faz-se um For/each na coleção components da aplicação. Se o componente estiver selecionado na lista, então será processado. Observe que é utilizada uma função para identificar se o componente está selecionado na lista, simplificando o código.

Se o componente precisar ser processado, obtem-se a coleção de roles do componente e faz-se um for na lista de roles, verificando quais roles estão selecionadas. Para cada role selecionada adiciona-se esta Role na coleção RolesForComponent, criando um novo objeto RoleForComponent.

Por fim, falta a função ComponenteEstaSelecionado, que não traz nada de novo :

Function ComponenteEstaSelecionado(NomeCom As String) As Boolean
     Dim icnt As Integer
  For icnt = 0 To lstComponentes.ListCount - 1
     If UCase(NomeCom) = UCase(lstComponentes.List(icnt)) Then
     If lstComponentes.Selected(icnt) Then
           ComponenteEstaSelecionado = True
     Else
         ComponenteEstaSelecionado = False
     End If
     Exit Function
     End If
  Next
End Function

É feito um for na lista de componentes para identificar se o componente encontra-se ou não selecionado, retornando true ou false.

Com esse exemplo vimos como podemos manipular a configuração do COM+ via código, criando aplicações que facilitem o trabalho de gerenciamento do COM+ .

Dennes Torres
MCSD,MCSE,MCDBA



� Búfalo Informática, Treinamento e Consultoria - Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br