Componentes na fila como passar objetos como parâmetros para COM +

Traduções deste artigo Traduções deste artigo
ID do artigo: 246627 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Na fila componentes permitem que você chamar funções de objeto que serão gravadas, encaminhado pelo Microsoft Message Queue Server (MSMQ) e repetidos, em seguida, no servidor onde o componente na fila está configurado. Em alguns casos, os parâmetros das funções que está sendo gravadas podem incluir objetos. Você pode fazer isso com componentes enfileirados, mas devem seguir determinadas regras para que o objeto de argumento recriado quando a chamada do método é reproduzida no servidor:
  • O objeto sendo passado como um argumento deve oferece suporte para IPersistStream. No Visual Basic, ele deve ser marcado como "persistente" e deve implementar as funções Class_ReadProperties e Class_WriteProperties corretamente.
  • A classe de objeto sendo passada como um argumento deve ser registrada corretamente no computador cliente e o computador servidor.
  • Independentemente das opções acima, uma instância de componente criada como enfileirado pode ser passada como um parâmetro a um segundo componente na fila.

Mais Informações

Como funciona

O que acontece quando é feita uma chamada a um componente na fila, e um objeto é passado como um argumento?

Eis um exemplo: suponha que você tenha um objeto que você usar para gerenciar informações do cliente chamadas Customer.CCustomer. Este objeto é implementado no arquivo Customer.dll e tem o código a seguir. Observe que está marcado como persistente e observe sua implementação de métodos adequados:
'CCustomer Class. Marked as 'Persistable'
Option Explicit

Public Name As String
Public Age As Integer
Public Address As String

Private Sub Class_ReadProperties(PropBag As PropertyBag)
    Name = PropBag.ReadProperty("Name")
    Age = PropBag.ReadProperty("Age")
    Address = PropBag.ReadProperty("Address")
    MsgBox "Person read!!"
End Sub

Private Sub Class_WriteProperties(PropBag As PropertyBag)
    PropBag.WriteProperty "Name", Name
    PropBag.WriteProperty "Age", Age
    PropBag.WriteProperty "Address", Address
    MsgBox "Person Written!!"
End Sub

Private Sub Class_Initialize()
    MsgBox "CCustomer Class_Initialize"
End Sub

Private Sub Class_Terminate()
    MsgBox "CCustomer Class_Terminate"
End Sub
				
esta classe de exemplo não faz nada, exceto informações do cache. Em um cenário de mundo real, no entanto, você provavelmente teria outros métodos (e nenhuma caixa de mensagem da Class_Initialize!).

Agora, imagine que há um objeto que foi projetado para uso do servidor. Este objeto é chamado Orders.COrder, é em um arquivo separado chamado Orders.dll e tem uma função com o seguinte código:
Public Sub AddOrder(ByVal ItemID As Long, ByVal Amount As Double, ByVal Customer As Customer.CCustomer)
    
    MsgBox "Customer order for item '" & ItemID & "' for " & Customer.Name
    
End Sub
				
Observe que as informações do cliente para a ordem são especificadas diretamente como um objeto do tipo Customer.CCustomer. No mundo real, provavelmente você deve participar de alguma atividade de banco de dados neste método. No entanto, neste exemplo tudo o que você precisa fazer é gerar uma caixa de mensagem.

E última mas não menos importante, há o cliente aplicativo EXE. Tudo isso tem é um formulário e um botão de comando na qual você digitar o código a seguir:
    Dim oOrder As COrder
    
    Dim oCust As CCustomer
    Set oCust = New CCustomer
    oCust.Name = "Eduardo A. Jezierski"
    oCust.Age = 23
    oCust.Address = "One Microsoft Way, Redmond, WA"
    
    Set oOrder = New COrder    
    oOrder.AddOrder 123, 100, oCust
    Set oOrder = Nothing
    
    Set oCust = Nothing
				
falar você configurou seu componente de ordens de dentro do COM +, adicioná-lo a um aplicativo do COM +. Quando um usuário clica no botão no cliente, acontece o seguinte:
  1. Um objeto CCustomer é criado (elevar a caixa de mensagem CCustomer Class_Initialize ) e preenchido pelo cliente.
  2. Um objeto COrder é criado.
  3. O método AddOrder é executado no COM + aplicativo.
  4. Uma caixa de mensagem informando que "Ordem de cliente para item '123' Eduardo r. Jezierski" será exibida.
  5. A instância COrder é destruída.
  6. A instância CCustomer for destruída, colocar a caixa de mensagem CCustomer Class_Terminate .

Apresentar as filas

O assim que acontece agora se você colocar em componentes na fila?

Para testar isso, primeiro configure seu componente COrder como enfileirado. Consulte o seguinte artigo Base de dados de Conhecimento Microsoft para instruções:
246825Como configurar um aplicativo do COM + para o QC
Em seguida, modifique o aplicativo cliente para que os componentes criados são enfileirados. Para fazer isso, altere a linha onde o COrder é criado para ser da seguinte forma:
Set o = GetObject("queue:/new:Orders.COrder")
				
isso efetivamente lhe dará um objeto de COrder "stand-in" que registrará as chamadas de método e será expedição-los para o objeto COrder colocada em seu aplicativo COM +.

O restante do aplicativo permanece o mesmo. Quando você testá-lo, no entanto, um conjunto muito diferente de eventos ocorre:
  1. Primeiro, um objeto de cliente é criado e preenchido pelo cliente.
  2. Uma instância de gravador na fila COrder é criada usando a função GetObject com o moniker especificado.
  3. O método AddOrder é invocado. O gravador de componentes ENFILEIRADOS, se comportando como COrder, obtém o objeto Customer, que obtém seu Class_WriteProperties função chamada para que seu estado é persistido, juntamente com todos os outros parâmetros (ItemID e valor).
  4. A instância de gravador COrder é definida como nada. Por este ponto, todas as chamadas chamadas nele (apenas o AddOrder neste caso) são incluídas em conjunto com o token de segurança cliente e outras informações, encapsulado em uma mensagem de Microsoft Message Queue Server (MSMQ) e enviados para o destino.
  5. O cliente precisar concluir seu trabalho, destrói a instância de cliente e termina seu trabalho.

    Enquanto isso...

  6. Depois que a mensagem é enviada, suponha que eventualmente atinge fila do aplicativo desejado.
  7. Porque o aplicativo foi definido para "escutar" mensagens, ele detecta a chegada de mensagem do MSMQ e detecta que ele pertence a um COrder classe usado pelo usuário X . Depois de fazer acesso verifica, ele cria uma instância COrder no servidor.
  8. Agora a parte "reprodução" do texto for iniciada. O player de componentes ENFILEIRADOS inicia invocar os métodos de gravador armazenado na mensagem.
  9. Nesse caso, que é apenas o método AddOrder. No entanto, como os parâmetros incluem um objeto Customer, primeiro é criada uma instância de CCustomer e é direcionada para "carregar próprio" por meio de Class_ReadProperties função.
  10. Depois que a instância está carregada, o player realmente chama o método de AddOrder no objeto COrder real, para que ele faz suas tarefas. Transmiti-la a nova instância de cliente como o argumento de chamada e quando a chamada é feita, ele destrói essa instância temporária. Em seguida, chama outras chamadas gravadas de maneira semelhante e, em seguida, libera o objeto COrder e instâncias de CCustomer temporárias.
Seu código COrder executado sem perceber que a instância de cliente que ele estava usando era realmente uma instância local e diferente do objeto de cliente que armazenado próprio no cliente, talvez minutos ou horas atrás. Dessa forma, o modelo toda assíncrono é mantido.

Propriedades

ID do artigo: 246627 - Última revisão: domingo, 23 de fevereiro de 2014 - Revisão: 2.7
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palavras-chave: 
kbnosurvey kbarchive kbmt kbcomplusqc kbhowto KB246627 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 246627

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com