Demonstra Passo a passo: Suporte a interoperabilidade COM exibir Janelas Formulários em um thread compartilhado
Você pode resolver problemas de interoperabilidade COM exibindo o formulário em um loop de mensagens .NET Framework, que você pode criar usando o método Application.Run.
Para fazer um Formuláriodo do Windows funcionar corretamente de um aplicativo cliente COM, você deve executá-lo em um loop de mensagem dos Formulários do Windows. Para fazer isso, use uma das seguintes abordagens:
Use o método Form.ShowDialog para exibir um Formulário do Windows. Para obter mais informações, consulte Como: Suporte a interoperabilidade COM exibição de um formulário do Janelas com o método ShowDialog.
Exiba cada Formulário do Windows em um thread separado. Para obter mais informações, consulte Demonstra Passo a passo: interoperabilidade COM suporte, exibindo cada formulário do Janelas em seu próprio thread..
Crie um loop de mensagens compartilhado em um novo thread no componente .NET Framework.
O código exemplo a seguir demonstra como exibir Formulários do Windows em um novo thread com um loop de mensagem compartilhado.
Para copiar o código deste tópico como uma única lista, consulte Como: Oferecer suporte a interoperabilidade COM, exibindo o Janelas Formulários em um thread compartilhado.
Procedimento
Essa abordagem é parecida com a mostrado em Demonstra Passo a passo: interoperabilidade COM suporte, exibindo cada formulário do Janelas em seu próprio thread.. No entanto, em vez de exibir cada formulário em seu próprio thread usando seu próprio loop de mensagens, você cria um loop de mensagens compartilhado que é executado em apenas um novo thread no componente .NET Framework.
Essa abordagem representa com mais precisão o comportamento de um aplicativo padrão de Formulários do Windows. Esta abordagem também torna mais fácil para você compartilhar recursos entre vários formulários, porque todos os formulários são executados no mesmo segmento. A solução Demonstra Passo a passo: interoperabilidade COM suporte, exibindo cada formulário do Janelas em seu próprio thread. cria um novo thread para cada formulário. Essa solução requer código de sincronização de threads adicional para compartilhar recursos entre diferentes formulários.
Como essa abordagem é mais semelhante ao comportamento de um aplicativo Formulários do Windows, você verá que Formulários do Windows .NET Framework que o aplicativo cliente abre serão fechado quando o loop de mensagem .NET Framework para. Esse comportamento ocorre quando o usuário fecha o formulário designado como o formulário principal para o ApplicationContext. O ApplicationContext é usado para iniciar o loop de mensagens.
Nos códigos exemplo a seguir, o formulário principal do ApplicationContext é definido como o primeiro formulário que o aplicativo cliente abre. Portanto, quando o usuário fechar esta instância do formulário, o loop de mensagens .NET Framework termina e todas os outros Formulários do Windows serão fechados.
Para criar um loop de mensagens compartilhado em um novo thread para que todos os formulários usem
Crie um novo projeto de biblioteca de classes e nomeie-o COMWinform.
Exclua o Class1.vb padrão do arquivo.
No menu Project clique em Add Class.
Selecione o modelo Classe COM.
Na caixa Nome, digite COMForm.vb e em seguida, clique em Adicionar.
Cole as instruções de código a seguir na parte superior do arquivo COMForm, antes da definição de classe.
Imports System.Windows.Forms Imports System.Runtime.InteropServices
Em definição da classe COMForm, cole o seguinte código sob a definição do construtor.
Private WithEvents frmManager As FormManager Public Sub ShowForm1() ' Call the StartForm method by using a new instance ' of the Form1 class. StartForm(New Form1) End Sub Private Sub StartForm(ByVal frm As Form) ' This procedure is used to show all forms ' that the client application requests. When the first form ' is displayed, this code will create a new message ' loop that runs on a new thread. The new form will ' be treated as the main form. ' Later forms will be shown on the same message loop. If IsNothing(frmManager) Then frmManager = New FormManager(frm) Else frmManager.ShowForm(frm) End If End Sub Private Sub frmManager_MessageLoopExit() Handles frmManager.MessageLoopExit 'Release the reference to the frmManager object. frmManager = Nothing End Sub
No menu Projeto, clique em Adicionar Classe e selecione o modelo Classe.
Na caixa Nome, digite FormManager.vb e em seguida, clique em Adicionar .
Substitua o conteúdo do arquivo FormManager pelo código a seguir.
Imports System.Runtime.InteropServices Imports System.Threading Imports System.Windows.Forms <ComVisible(False)> _ Friend Class FormManager ' This class is used so that you can generically pass any ' form that you want to the delegate. Private WithEvents appContext As ApplicationContext Private Delegate Sub FormShowDelegate(ByVal form As Form) Event MessageLoopExit() Public Sub New(ByVal MainForm As Form) Dim t As Thread If IsNothing(appContext) Then appContext = New ApplicationContext(MainForm) t = New Thread(AddressOf StartMessageLoop) t.IsBackground = True t.SetApartmentState(ApartmentState.STA) t.Start() End If End Sub Private Sub StartMessageLoop() ' Call the Application.Run method to run the form on its own message loop. Application.Run(appContext) End Sub Public Sub ShowForm(ByVal form As Form) Dim formShow As FormShowDelegate ' Start the main form first. Otherwise, focus will stay on the ' calling form. appContext.MainForm.Activate() ' Create a new instance of the FormShowDelegate method, and ' then invoke the delegate off the MainForm object. formShow = New FormShowDelegate(AddressOf ShowFormOnMainForm_MessageLoop) appContext.MainForm.Invoke(formShow, New Object() {form}) End Sub Private Sub ShowFormOnMainForm_MessageLoop(ByVal form As Form) form.Show() End Sub Private Sub ac_ThreadExit(ByVal sender As Object, ByVal e As System.EventArgs) Handles appContext.ThreadExit appContext.MainForm.Dispose() appContext.MainForm = Nothing appContext.Dispose() appContext = Nothing RaiseEvent MessageLoopExit() End Sub End Class
No menu Projeto,clique em Adicionar Formulário do Windows e em seguida, clique em Adicionar.
Adicione alguns controles TextBox e um controle Button ao formulário.
Clique duas vezes em Button1 para adicionar um manipulador de eventos Click.
Adicione o seguinte código para o manipulador de eventos Click.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("Clicked button") End Sub
Crie a solução.
Esta etapa também registra o projeto para interoperabilidade COM neste computador.
Para criar um arquivo executável que demonstra interoperabilidade COM
Inicie Microsoft Visual Basic 6.0.
Crie um novo projeto EXE padrão.
No menu Projeto, clique em Propriedades..
Adicione uma referência para a biblioteca de tipos COMWinform que foi gerado quando você criou a solução Visual Basic 2005.
- ou -
Se não você a viu na lista, clique em Pesquisar para localizar o arquivo biblioteca de tipos (.tlb) manualmente.
Adicione um botão ao formulário.
No menu Visualizar, clique em Código e, em seguida, adicione o código a seguir ao módulo do formulário.
Option Explicit
Private Sub Command1_Click()
Dim frm As COMWinform.COMForm
Set frm = New COMWinform.COMForm
frm.ShowForm1
End Sub
No menu de Arquivo , Clicar do Make EXE para compilar o projeto.
Execute o arquivo executável compilado do Visual Basic 6. 0.
Clicar no botão Exibir formulário do Janelas, a biblioteca de classes que você criou anteriormente.
Conjunto o foco em um do TextBoxcontroles no formulário do Janelas e em seguida, Pressionar o Tabulação chave para se mover entre controles.
Observe que o Tabulação chave move o foco de controle para controle. Além disso, observe que de Clickevento é Erguido quando você pressiona a tecla Inserir. o botão de
Consulte também
Tarefas
Como: Suporte a interoperabilidade COM exibição de um formulário do Janelas com o método ShowDialog
Conceitos
Expondo componentes de moldura Pacote Microsoft Office 2010 para COM
Empacotando um assembly de COM
O registro de módulos (assemblies) COM
Visão Geral de Aplicativos de Formulários do Windows e Aplicativos Não Gerenciados