EXEMPLO: MFCAxs.exe implementa um host de scripts Active usando MFC

Traduções deste artigo Traduções deste artigo
ID do artigo: 168214 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

MFCAxs.exe é um exemplo que contém MfcAxscrVb. MfcAxscrVb é um exemplo de instrução Activos host escrito usando o MFC. Ele hospeda a DLL de VBScript; no entanto, os mecanismos de scripts ativos são genéricos para qualquer mecanismo de scripts ativos. MfcAxscrVb mostra apenas uma maneira possível de fornecem objetos de expedição do host, para implementar scripts ativos interfaces do host de e para conectar-se as mensagens de janelas no host com eventos disparados para o mecanismo de script.

MfcAxscrVb inclui um arquivo de espaço de trabalho e projeto do Visual C++ 5.0. Embora nenhum VC ++ 4.2 makefile compatível ou mdpfile seja fornecido, o código-fonte MfcAxscrVb é compatível com MFC 4.2b.

Pré-requisitos: COM, automação

Mais Informações

O seguinte arquivo está disponível para download no Centro de download da Microsoft:
MFCAxs.exe
Para obter informações adicionais sobre como baixar arquivos de suporte da Microsoft, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
119591Como obter arquivos de suporte da Microsoft a partir de serviços online
Microsoft examinou esse arquivo em busca de vírus. Microsoft utilizou o mais recente software de detecção de vírus que estava disponível na data em que o arquivo foi publicado. O arquivo é armazenado em servidores com segurança avançada que ajudam a evitar qualquer alteração não autorizada no arquivo.

Executando o exemplo

Quando você executa a amostra MfcAxscrVb você notará um controle de edição grande no canto superior esquerdo do aplicativo. Você pode colar ou tipo de script para essa janela e selecione "executar script" botão para chamar o script. Vários scripts de teste são fornecidos para você nos arquivos Script.txt e Testevents.txt.

Expondo o host: enviar objetos

O foco principal para esse exemplo é a implementação de objetos de distribuição usando o MFC. O motivo para isso é simples. Uma linguagem de script não é muito usado se não houver nada para script.

A principal tecnologia na qual todos os scripts ativos depende é a maioria dos certamente a automação. Um conhecimento funcional sólido de automação é absolutamente necessário antes de tentar qualquer host de scripts ativos de código. Há várias boas referências para automação: capítulos 14 e 15 de "Inside OLE do Brockshmidt," Capítulo 11 "Interna COM de Dale Rogerson" e "Referência do programador de automação de OLE".

CCmdTargetPlus:

O que você precisa são alguns objetos que permitem programáveis propriedades e métodos através de IDispatch, mas também geram eventos programáveis. MFC definitivamente faz grande parte do trabalho pesado por você ao implementar interfaces de expedição para um objeto COM. No entanto, a única classe MFC oferece suporte a interfaces de expedição de entrada e saída interfaces dispatch ou receptores de evento, é COleControl. COleControl é muito muito bulky para o que deseja. Você apenas deseja eventos, uma interface de distribuição e digite informações. VBScript precisa ler informações de tipo para objetos de distribuição que oferecem suporte a eventos. Você pode criar isso rapidamente, ou criar uma biblioteca de tipos estáticos para objetos de expedição do host e obter o ITypeInfo para cada objeto individual.

Embora provavelmente não necessário, MfcAxscrVb tem uma classe base chamada CCmdTargetPlus oferece suporte a essas três partes: pontos de conexão com um mapa de evento do estilo de controle e informações de tipo facilmente acessíveis por meio de IProvideClassInfo, interface de distribuição. A maioria do código no CmdTargetPlus foi adicionado para permitir para mapas de evento, que torna a adição de eventos para classes muito mais fácil derivadas.

distribuir objetos:

Expedição fornecido pelo host todos os objetos são implementados usando CCmdTargetPlus. Existem um algumas coisas que eles precisam fazer para funcionar bem. Consulte qualquer um dos objetos da expedição (CAButtonDispatch, CBButtonDispatch e assim por diante) para um timbre no que é necessário. Um breve resumo no modelo de objeto do MfcAxscrvb é listado no final deste documento.

Se você adicionar seus próprios objetos, certifique-se de verificar novamente para três GUIDs exclusivos para as interfaces principais eventos e expedição primária e para o clsid para o objeto na soma. Isso precisa ser feito no arquivo de implementação e no arquivo .odl. (Recortar e colar ajuda aqui). Recortar e colar todas as macros do Assistente de classe e, em seguida, alterá-los para o novo nome de classe. Assistente de classe é muito específico, mas se você seguir tudo apenas direita no .odl,. h e .cpp arquivos, você pode usá-lo para adicionar novos eventos, propriedades, e métodos para a distribuição de objeto como se fosse um MFC controle OLE. Isso é útil de classificação.

MfcAxscrVb mantém o objeto que implementa os mecanismos de distribuição separados do objeto MFC, o que realmente se referindo a. Por exemplo, a caixa de diálogo tem um botão chamado de "AButton," que é programável por scripts. O objeto de botão MFC é CButton. A classe derivada de CCmdTargetPlus, CAButtonDispatch, é separados e distintos. Esse é um ponto chave. Somente o que o programador de host explicitamente optar expor para objetos básicos de MFC e controles do Windows será programável.

CEventsButton, CEventsEdit, CeventsListBox:

Para eventos, deve haver um código que responde a um Windows evento--digamos, um clique de botão--e gera um evento para o mecanismo de script. (Lembre-se de que um evento é uma expedição Invoke em uma interface manipulada por pontos de conexão no objeto de host.) Este exemplo faz isso adicionando manipuladores de mensagem padrão do MFC em objetos derivados de várias classes. Cada um desses manipuladores simplesmente tem chamar FireEvent (cortesia do código adicionado ao CCmdTargetPlus) no objeto de expedição. Tudo o que acontece automaticamente.

Como o objeto de expedição e o objeto de janela real do MFC são separados neste exemplo, o diálogo pai precisa explicitamente conectar os dois juntos. Isso é feito no construtor Mfcaxscrvbdlg.

Itens nomeados

Depois de ter objetos de distribuição, você precisará configurá-los de modo que o mecanismo de script sabe sobre eles. A coleção de todos os objetos expedição nomeado que o mecanismo de script sabe sobre é chamada "Namespace Script". Itens são adicionados ao espaço para nome script por meio do método IActiveScript::AddNamedItem. Como mencionei anteriormente, é imposto do host para implementar um IDispatch para o objeto e informações de tipo por meio de ITypeInfo de suporte para o objeto. Quando o mecanismo de script precisa resolver uma referência a um item nomeado, ele usa o método IActiveScriptSite::GetItemInfo para solicitar um ponteiro IUnknown (que ele consulta principalmente para IDispatch) e um ponteiro de ITypeInfo.

Nem tudo que um host deseja ser programável precisa ser um item nomeado. Geralmente, o host terá uma hierarquia de objetos, onde subobjetos estão acessíveis através de um objeto de nível mais alto. Uma metáfora comum é o aplicativo-> documento-> hierarquia de item, onde o objeto Document é acessível a partir do objeto Application nível superior como uma propriedade IDispatch do objeto Application propriamente dito. Da mesma maneira, o próprio objeto Document expõe vários subobjetos e cada um é um item que você pode obter por meio de uma matriz de item ou outro contrivance.

Usando esse esquema, o mecanismo de script é inteligente o suficiente para navegar para um sub-item quando o código de script diz o seguinte sem a necessidade de documento ou item a ser adicionado ao namespace de script:
Set Obj = Application.Document.Item(1)
				
como os subobjetos são expostos como propriedades get de seu objeto pai, desde que o mecanismo de script encontrá-las com êxito. Interessante, o mecanismo de script é capaz de "supor" o item na hierarquia de nível superior. Isso significa que, se aplicativos é declarado como o item de nível superior, em seguida, é suficiente para dizer o seguinte para o código de script anterior:
Set Obj = Document.Item(1)
				
isso é exatamente como Internet Explorer 3.0 permite ao código de script no contexto do objeto Window sem sempre colocação de um prefixo todas as referências a objetos com "Janela". Um host de script precisa identificar o item de nível superior do script na chamada para AddNamedItems usando o sinalizador SCRIPTITEM_GLOBALMEMBERS. O que geralmente não é feita desmarque pela documentação de scripts ativos, no entanto, é chamado somente itens pode suportam eventos. Usando o exemplo acima, não há nenhuma sintaxe dizer o seguinte para manipular um evento em um determinado item:
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!
				
assim, para MfcAxscrvbdlg, porque queremos ser capaz de manipular os eventos de cada objeto na hierarquia, cada objeto é adicionado como um item nomeado. Cada objeto também é acessível através do objeto criador de scripts nível superior (a caixa de diálogo próprio), que não dá suporte a eventos no momento.

controle WebBrowser:

Neste exemplo, o host de scripts expõe apenas um objeto externo para o namespace de script. Isso é o controle WebBrowser hospedado na caixa de diálogo pelo suporte de confinamento de controle de padrão do MFC. Tudo o que você precisa é um AddRef seria expedir o ponteiro para o controle e você está definido. Para eventos, o objeto externo precisa expor um ponteiro de ITypeInfo alguma forma. MfcAxscrVb obtém isso IProvideClassInfo::GetClassInfo. Como um último recurso, um host foi possível ler informações do objeto de tipo para expor um ITypeInfo. Felizmente, o controle WebBrowser suporta GetClassInfo, portanto MfcAxscrVb não faça isso.

Se você quiser adicionar outros objetos de automação externo ao espaço para nome, tudo o que geralmente é necessário é obter uma interface IUnknown usando CoCreateInstance. Como alternativa, o host pode oferecer suporte um meio genérico para obter objetos externos, embora aquelas que não precise tem eventos manipulados. No Visual Basic, a função para fazer isso é chamada a CreateObject.

Obtendo para outros aplicativos: HostCreateObject

Diferente do conjunto de propriedades usados para expor todos os objetos filho, o principal objeto de criador de scripts (diálogo própria classe) expõe apenas um método especial. Esse método demonstra que um meio simples para simular a função de CreateObject do VB. Observe que o método é chamado HostCreateObject para enfatizar que este método não é fornecido gratuitamente pelo mecanismo de script, mas o host deve implementá-lo próprio. Alguns hosts claramente não deseja fornecer essa capacidade para razões de segurança, IE3 é um exemplo principais. O principal objetivo de HostCreateObject é retornar o ponteiro de expedição do objeto solicitado. Depois que o mecanismo de script tiver o ponteiro de expedição, ele sabe o que fazer a partir daí.

Observação : como da versão 2.0, os mecanismos VBScript e JScript agora oferecem suporte CreateObject como uma função interna. O host não é necessário implementar esta função. Esta função, no entanto, testará um objeto para verificar se é seguro para script antes de permitir que o objeto a ser usado. Objetos próprios considerar seguros para script pelo suporte a interface IObjectSafety ou marcando as entradas de registro apropriadas categoria de componente para seguro para scripts. Consulte a base de dados de Conhecimento para obter mais informações.

Suporte do Assistente de classe

O último pouco de trickery em MfcAxscrVb é manipulações feitas para suportar ClassWizard. Assistente de classe, tecnicamente não é "inútil". Apenas mentalmente são desafiado. É muito conveniente para que ele faz, mas lembre-se que ele procura apenas cegamente arquivos procurando nesses comentários ClassWizard especiais. Se você seguir o formato para COleControl, você pode apenas sobre obter imediatamente com o uso do ClassWizard automação e eventos guias.

Uma complicação é que MfcAxscrVb usa derivação em alguns sua hierarquia de objeto. Todos os objetos botão são derivados de um objeto CButtonDispatch comum que expõe propriedades e métodos, que todos os quais ele individualmente seria compatíveis. No entanto, quando se trata de tempo para preencher o arquivo .odl, cada objeto individual precisa conter todas as propriedades e métodos da classe pai. Não é preciso dizer que isso será confundir o Assistente de classe quando se trata para numerar os DISPIDs. Se você usar Assistente de classe, certifique-se você verificar os DISPIDs gerados em dois locais: o arquivo .odl para a classe de automação e a enumeração dentro da definição de classe. Ao trabalhar com as classes derivadas de botão, é fácil ver o mesmo DISPID atribuída a várias propriedades e métodos. É muito mais fácil corrigir os DISPIDs, porém, que para adicionar tudo por zero, portanto, a funcionalidade foi deixada no MfcAxscrVb.

Com suporte aprimorado do Visual C++ 5.0 de IDL métodos e propriedades por meio de ClassView, é um toss backup se ClassWizard é necessária ou não. Mas MfcAxscrVb suporta-lo por enquanto. Aproveite.

Apêndice A: modelo de objeto

criador de scripts:

Isso é o objeto mestre do qual todos os outros objetos são derivados. Ele é "IMfcaxscrvbDlg" no arquivo .odl mas é adicionado como item nomeado "Criador de scripts". Ele tem um método, HostCreateObject, que está descrito acima.

botão objetos:

AButton BButton, RunScript CancelButton, OKButton,

Propriedades
  • Legenda: Texto da face de botão.
métodos Pressione: Funcionar como se o botão foi pressionado.
  • Pressione: Funcionar como se o botão foi pressionado.
eventos
  • Ao clicar: Acionado quando o botão é pressionado.
  • OnMouseOver: Acionado quando o mouse passa sobre o botão.
  • OnFocus(bSet): Acionado quando o foco é dado ou retirada do botão.
BroCon:

BroCon é o nome do controle WebBrowser na caixa de diálogo. Dá suporte a todas as propriedades e métodos, conforme documentado no SDK Internet cliente SDK/ActiveX para o controle WebBrowser.

EditCon:

métodos
  • AppendLine(strToAdd): Adiciona strToAdd ao fim da janela de edição de texto.
  • InsertLine (strToAdd, nOnde): adiciona strToAdd na linha #nWhere.
  • RemoveLine(nWhere): Remove # nWhere linha da janela de edição.
eventos
  • OnMouseOver: Acionado quando o mouse rola pela janela.
  • OnChar(strChar): Acionado quando strChar caractere é inserido em janela.
  • OnFocus(bSet): Acionado quando o foco é dado ou retirada do botão.
Lbox:

métodos
  • AddString(strIn): Adiciona StrIn para caixa de listagem.
  • ClearList: Limpa todas as seqüências de caracteres na caixa de listagem.
  • RemoveString(strRemove): Remove a primeira instância de StrRemove e remove da caixa de listagem.
  • SelectString(strSelect): Seleciona a seqüência especificada pela strSelect.
eventos
  • OnMouseOver: Acionado quando o mouse rola pela janela.
  • OnFocus(bSet): Acionado quando o foco é dado ou retirada do botão.
  • OnSelCancel(strCancelled): Quando seleção é cancelada em uma lista caixa elemento strCancelled.
  • OnSelChange(strChange): Quando um strChange de elemento de caixa de lista é selecionado pelo usuário.

Propriedades

ID do artigo: 168214 - Última revisão: quinta-feira, 5 de agosto de 2004 - Revisão: 2.2
A informação contida neste artigo aplica-se a:
  • Microsoft Internet Explorer 3.01
  • Microsoft Internet Explorer 3.02
  • Microsoft Internet Explorer 4.0 Edição de 128 Bits
  • Microsoft Internet Explorer 4.01 Service Pack 2
  • Visual Basic, Scripting Edition 1.0
  • Microsoft Visual Basic, Scripting Edition 1.1
  • Visual Basic, Scripting Edition 2.0
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
Palavras-chave: 
kbmt kbdownload kbfile kbinfo kbsample KB168214 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: 168214
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

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