Artigo: 194873 - Última revisão: quinta-feira, 2 de Junho de 2005 - Revisão: 5.0

Como aceder a uma DLL de ActiveX do Visual Basic a partir de um executável de Visual C++ 6.0

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo mostra três formas de aceder uma DLL de ActiveX do Visual Basic a partir do Visual C++ 6.0 executável.

Mais Informação

Este artigo representa uma introdução à criação de clientes do Visual C++ para componentes ActiveX do Visual Basic. Se já estiver proficient com o Visual C++, poderá consultar a secção de referência para uma lista de tópicos mais avançados.

Passos para criar o servidor do Visual Basic



  1. Crie um projecto do Visual Basic ActiveX DLL. Aula1 é criado por predefinição.
  2. Adicione o seguinte código para Aula1:
          Public Function MyVBFunction(x As Integer) As Integer
             MsgBox x
          End Function
    						
  3. Compile a DLL como c:\Project1.dll e saia do Visual Basic.
Método 1 - CreateDispatch:

  1. Inicie o Visual C++ e seleccione novo no menu ficheiro. Escolher MFC AppWizard (Exe) e um nome de projecto e clique em ' OK '. Quando o AppWizard MFC é apresentada a caixa de diálogo, clique em ' Concluir '. Clique em OK na caixa de diálogo seguinte.
  2. Seleccione ClassWizard no menu Ver, escolha Ctst1App na caixa Nome de classe e faça duplo clique em InitInstance na caixa de mensagens. Clique em Editar o código para apresentar o código para CTst1App::InitInstance() BOOL, localize a linha AfxEnableControlContainer(); e adicione a seguinte linha antes:
          AfxOleInit();
  3. Seleccione ClassWizard no menu Ver e faça clique sobre o separador de automatização. AddClass clique em e seleccione "de TypeLibrary". Especificar Project1.dll, a DLL do Visual Basic que foi criada no passo 3. Quando aparecer a caixa de diálogo Confirmar Classes, clique em OK. Clique em OK novamente para fechar o MFC ClassWizard caixa de diálogo.
  4. Abrir o ficheiro de .cpp < Nome da Aplicação > e adicione a linha # include "Project1.h". Tem de incluir Project1.h sempre que tiver código acede project1.dll.
  5. Abra o ClassWizard novamente. No separador mapeamentos de mensagem, seleccione CAboutDlg na caixa de nome de classe e IDOK na caixa ID de objecto e, em seguida, faça duplo clique em BN_CLICKED. Clique em OK em resposta a caixa de diálogo e OK novamente para fechar o ClassWizard.
  6. Abrir < Nome da Aplicação >.cpp, desloque-se para baixo para theCAboutDlg::OnOK() e substitua-o seguinte código:
          void CAboutDlg::OnOK()
          {
    
          short st = 2;
          short st1;
          _Class1 p;
          p.CreateDispatch("Project1.Class1");
          st1 = p.MyVBFunction(&amp;st);
          CDialog::OnOK();
          }
    						
  7. Compile o ficheiro .exe (F7).
  8. Execute o ficheiro .exe e seleccione Acerca de no menu ' Ajuda '. Clique em OK na caixa Acerca de e é apresentada a caixa de mensagem que foi especificada em project1.dll. Clique no botão Fechar para fechar a caixa de diálogo.
Método 2 - #IMPORT:

  1. Inicie o Visual C++ 6.0 e crie uma consola Win32 Application. Seleccione "Um projecto vazio" e clique em ' Concluir '.
  2. Aponte para adicionar a um projecto no menu projecto e clique em novo para adicionar um novo ficheiro de origem do C++ ao projecto. Cole o seguinte código no novo ficheiro de origem e guardá-lo:
          #include <stdio.h>
    
          // This is the path for your DLL.
          // Make sure that you specify the exact path.
    
          #import "c:\project1.dll"  no_namespace
    
          void main()
          {
           BSTR bstrDesc;
    
          try
          {
          CoInitialize(NULL);
          short st = 2;
           short st1;
          // Declare the Interface Pointer for your Visual Basic object. Here,
          // _Class1Ptr is the Smart pointer wrapper class representing the
          // default interface of the Visual Basic object.
    
          _Class1Ptr ptr;
          // Create an instance of your Visual Basic object, here
          // __uuidof(Class1) gets the CLSID of your Visual Basic object.
    
           ptr.CreateInstance(__uuidof(Class1));
           st1 = ptr->MyVBFunction(&st);
          }
          catch(_com_error &e)
          {
           bstrDesc = e.Description();
    
          }
          CoUninitialize();
          }
    						
  3. Compile e execute o projecto. Deverá ser apresentada a caixa de mensagem de Project1.DLL.
O método #import pode ser utilizado de uma aplicação de Win32, uma aplicação de consola, ou em MFC bem.

Método 3 - puro COM interface

  1. Inicie o Visual C++ e seleccione novo a partir do menu ' ficheiro '. Escolher MFC AppWizard (Exe), atribua um nome tst1 projecto e clique em OK. Quando o MFC caixa de diálogo Appwizard for apresentada, seleccione a caixa de diálogo com base e clique em ' Concluir '. Clique em OK quando é apresentada a seguinte caixa de diálogo.
  2. O Editor de recursos é iniciado por predefinição. Elimine todos os controlos na caixa de diálogo e adicione um botão de comando, mantendo a legenda predefinidos "Button1".
  3. Faça duplo clique em Button1 para apresentar a função de membro adicionar caixa de diálogo. Clique em OK para aceitar o nome OnButton1.
  4. Clique em Visualizador de objectos OLE/COM no menu Ferramentas. Seleccione Ver Typelib a partir do menu ' ficheiro ' e escolha Project1.dll que criou anteriormente. Clique em Abrir para apresentar o ITypeLib Viewer, que contém o ficheiro .idl para a DLL.
  5. Copie o conteúdo do ficheiro .idl (conteúdo do painel da direita) para a área de transferência. Mantenha a tecla SHIFT premida enquanto paginação ou deslocamento do primeiro carácter para o fim do texto no painel. Prima CTRL+C para copiar o texto marcado para a área de transferência.
  6. Clique em Novo no menu Visual C++ ficheiro. Seleccione o ficheiro de texto na nova caixa de diálogo, nome test1.idl ficheiro e clique em OK.
  7. Um ficheiro de texto em branco aparece. Colar os dados da área de transferência no mesmo e guarde o ficheiro.
  8. Seleccionar definições no menu Project, expanda tst1 os nós de ficheiros de origem da vista de árvore e seleccione test1.idl. Clique no separador MIDL, introduza test1.h na caixa "Nome de ficheiro de cabeçalho de saída" e clique em OK.
  9. Abra tst1Dlg.cpp e adicione os seguintes ficheiros para a secção inclui:
          #include <initguid.h>
          #include "test1.h"
    						
  10. Clique em ClassWizard no menu Ver, seleccione Ctst1App na caixa Nome de classe e faça duplo clique em InitInstance na caixa de mensagens. Clique em Editar código para visualizar o código:
          BOOL CTst1App::InitInstance()
    						
    localizar a linha:
          AfxEnableControlContainer();
    						
    a seguinte linha antes de adicionar:
          AfxOleInit();
    						
  11. Abra o ClassWizard novamente. No separador mensagens mapas seleccione CTst1Dlg na caixa de nome de classe e IDC_BUTTON1 na caixa ID de objecto. Faça duplo clique BN_CLICKED na caixa de mensagens e clique em Editar o código para visualizar o código para CTst1Dlg::OnButton1() void. Substituir a função OnButton1() com o seguinte código:
          void CTst1Dlg::OnButton1()
          {
             // TODO: Add your control notification handler code here.
    
             _Class1 *pClass = NULL;
             IUnknown *pUnk = NULL;
    
          //   HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,
          //   CLSCTX_INPROC_SERVER,IID__Class1,(void **)&pClass);
          //   You can directly get the Interface ID as in the previous line or
          //   you can do a QueryInterface on IUnknown to get the IID
          //   as in the following three lines:
    
          HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,CLSCTX_INPROC_SERVER,
          IID_IUnknown,(void **)&pUnk);
          hr = pUnk->QueryInterface(IID__Class1,(void **)&pClass);
          pUnk->Release();
    
          // Once you have the IID, you can make use of the interface pointer
          // to access our Visual Basic DLL.
    
          short st = 2;
          short st1;
          hr = pClass->MyVBFunction(&st,&st1);
          pClass->Release();
    
          }
    						
  12. Compile o ficheiro .exe (F7) e executar a aplicação (F5). Clique em Button1 na caixa de diálogo. É apresentada a caixa de mensagem de DLL do Visual Basic.

Referências

Para obter informações adicionais, consulte os seguintes artigos na base de dados de conhecimento da Microsoft:
178749  (http://support.microsoft.com/kb/178749/EN-US/ ) Como criar um projecto de automatização com MFC e uma biblioteca de tipos

188817  (http://support.microsoft.com/kb/188817/EN-US/ ) Como VC ++ MFC cliente para o exemplo ComCallingJava

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbinfo kbcode kbhowto KB194873 KbMtpt
Tradução automáticaTraduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 194873  (http://support.microsoft.com/kb/194873/en-us/ )