Passando objetos como parâmetros
O serviço de componentes em fila COM+ não habilita o enfileiramento para todos os componentes COM existentes. Há restrições sobre os tipos de métodos que podem ser enfileirados. Devido a restrições de mensagens, os métodos devem aderir às seguintes regras:
- Eles devem conter apenas parâmetros de entrada.
- Eles não devem retornar nenhum resultado específico do aplicativo.
Além disso, há restrições sobre os tipos de parâmetros de entrada que podem ser passados para um componente em fila. Em tempo de execução, o serviço de componentes em fila empacota os argumentos no cliente e os passa para o componente de servidor usando o serviço de enfileiramento de mensagens. Tipos simples, como inteiros e booleanos, podem ser empacotados facilmente — tipos mais complexos não podem ser empacotados sem ajuda.
No caso de passar um objeto através da chamada de método de um componente enfileirado como um parâmetro, o cliente passa o objeto para o gravador. O gravador transforma o objeto em uma mensagem do serviço de enfileiramento de mensagens e a transmite ao ouvinte. Depois que o ouvinte pega a mensagem e a passa para o player, o player deve reinstanciar o objeto para despachá-lo para a chamada de método especificada pelo cliente. Com base nos tempos de vida do cliente e do servidor em um ambiente em fila, a implicação é que esses objetos devem ser capazes de marshal por valor. Como o COM+ não fornece semântica de passagem por valor para objetos COM padrão, o gravador e o player precisam da ajuda do componente para organizar e desorganizar o objeto.
As referências de objeto que oferecem suporte a IPersistStream podem ser usadas como parâmetros para chamadas de método em componentes enfileirados. O objeto não pode fazer suposições sobre quando será reinstanciado. Por exemplo, o servidor pode estar indisponível ou o componente de servidor pode não ser iniciado até mais tarde no dia. Objetos que não oferecem suporte a IPersistStream retornarão um erro.
Objetos persistentes do Visual Basic
O Microsoft Visual Basic 6 permite que objetos persistentes sejam criados. Esses objetos oferecem suporte a IPersistStream e podem ser passados como parâmetros para chamadas de método de componente em fila. Antes que um objeto do Visual Basic pode ser passado para um componente em fila, o objeto persistente deve ser inicializado. Isso pode ser feito de uma das duas maneiras a seguir:
- Se o aplicativo que cria o objeto persistente é escrito no Visual Basic, o tempo de execução do Visual Basic manipula a inicialização do objeto automaticamente.
- Se o aplicativo que cria o objeto persistente do Visual Basic é escrito em uma linguagem diferente do Visual Basic, como o Microsoft Visual C++, o aplicativo deve inicializar explicitamente o componente consultando a interface IPersistStream do objeto persistente ou chamando o método IPersistStreamInit::InitNew ou IPersistStream::Load.
Conjuntos de registros ADO e conjuntos de linhas OLE DB
Passar objetos de conjunto de linhas ADO Recordset ou OLE DB entre componentes permite que um componente processe os resultados de consultas executadas por outro componente. Isso é útil ao implantar um aplicativo em vários computadores. Os objetos Recordset e rowset podem ser passados como parâmetros de método para componentes enfileirados, com as seguintes restrições:
- Os objetos Recordset do lado do servidor não podem ser empacotados usando IPersistStream. Somente objetos Recordset do lado do cliente podem ser passados como parâmetros para uma chamada de método de componente em fila.
- Se você trabalhar diretamente com OLE DB, o conjunto de linhas OLE DB deve ser definido como um conjunto de linhas do lado do cliente.