EJEMPLO: MFCAxs.exe implementa un host de secuencias de comandos Active usar MFC

Seleccione idioma Seleccione idioma
Id. de artículo: 168214 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

MFCAxs.exe es un ejemplo que contiene MfcAxscrVb. MfcAxscrVb es un host de Active Scripting ejemplo informativo programada mediante MFC. Que aloja la DLL de VBScript; sin embargo, los mecanismos de secuencias de comandos ActiveX son genéricos para cualquier motor de secuencias de comandos ActiveX. MfcAxscrVb muestra sólo una manera posible de proporcionar objetos de envío de host, para implementar interfaces de Active Scripting del host y para conectar los mensajes de windows en el host con los eventos desencadenados al motor de secuencias de comandos.

MfcAxscrVb incluye un archivo de área de trabajo y proyecto de Visual C++ 5.0. Aunque no se proporciona ningún archivo MAKE compatible de VC ++ 4.2 o mdpfile, el código fuente de MfcAxscrVb es compatible con MFC 4.2b.

Requisitos previos: COM, automatización

Más información

El archivo siguiente está disponible para descargarlo del Centro de descarga de Microsoft:
MFCAxs.exe
Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a impedir la realización de cambios no autorizados.

Ejecutar el ejemplo

Al ejecutar el ejemplo de MfcAxscrVb observará un control de edición grande en la esquina superior izquierda de la aplicación. Puede pegar o tipo de secuencia de comandos en esta ventana y seleccione el "Ejecutar script" botón para invocar la secuencia de comandos. Se proporcionan varias secuencias de comandos prueba en los archivos Script.txt y testevents.txt.

Exponer el host: objetos de distribución

El enfoque principal para este ejemplo es la implementación de objetos de distribución mediante MFC. La razón para esto es sencilla. Un lenguaje de secuencias de comandos no mucho uso si no hay nada para la secuencia de comandos.

La tecnología básica que todo Active Scripting depende es la mayoría ciertamente de automatización. Conocimientos sólidos de automatización es absolutamente necesario antes de intentar cualquier host Active Scripting de código. Hay varias buenas referencias para la automatización: capítulos 14 y 15 de "Inside OLE de Brockshmidt," capítulo 11 de Dale Rogerson "Inside COM" y "Referencia del programador de OLE Automation".

CCmdTargetPlus:

Lo que necesita son algunos objetos que permiten para secuencias de comandos propiedades y métodos a través de IDispatch, pero también generan eventos de secuencias de comandos. Al implementar las interfaces de envío para un objeto COM, MFC hace definitivamente la mayoría del trabajo pesado por usted. Sin embargo, la única clase MFC que admite interfaces de distribución entrantes y salientes interfaces de envío o receptores de sucesos, es COleControl. COleControl es mucho demasiado voluminosos que desee. Sólo los sucesos de una interfaz de envío y escriba información. VBScript necesita leer información de tipo de objetos de envío que admitan eventos. Puede crear este sobre la marcha, o crear una biblioteca de tipo estático para objetos de su host envío y obtener el ITypeInfo para cada objeto individual.

Aunque probablemente no es necesario, MfcAxscrVb tiene una clase base denominada CCmdTargetPlus que admita estas tres partes: puntos de conexión con un mapa de estilo de control de eventos e información de tipo fácilmente accesible a través de IProvideClassInfo, de interfaz de envío. La mayoría del código en CmdTargetPlus se agregó para permitir de mapas de eventos, que facilita agregar eventos a clases mucho más fácil de derivadas.

distribuir objetos:

Todos los objetos proporcionados por el host de envío se implementan mediante CCmdTargetPlus. Hay unas cuantas cosas que lo necesitan para funcionar bien. Consulte cualquiera de los objetos envío (CAButtonDispatch, CBButtonDispatch etc.) para un texto repetitivo en lo que es necesario. Un resumen breve en modelo de objetos del MfcAxscrvb se muestra al final de este documento.

Si agrega sus propios objetos, asegúrese de comprobar tres GUID únicos para las interfaces de eventos principal y de envío principal y el clsid para el objeto en suma. Esto debe hacerse en el archivo de implementación y en el archivo .odl. Ayuda (cortar y pegar a aquí.) Cortar y pegar todas las macros de Asistente de clase y, a continuación, cambiar al nuevo nombre de clase. Asistente para la clase es muy concreto, pero si sigue todo sólo derecha en .odl, .h y .cpp archivos, se puede utilizar para agregar nuevos eventos, propiedades, y métodos para el envío de objetos como si fuese un control MFC OLE. Esto resulta útil de ordenación.

MfcAxscrVb mantiene el objeto que implementa los mecanismos de distribución independientes del objeto MFC, que realmente se refiere a. Por ejemplo, el cuadro de diálogo tiene un botón denominado el "AButton", que es de secuencias de comandos. El objeto de botón MFC es CButton. La clase derivada de CCmdTargetPlus, CAButtonDispatch, es independiente y distinta. Esto es un punto clave. Sólo lo que el programador de host elige explícitamente exponer para objetos MFC básicos y controles de Windows será secuencias de comandos.

CEventsButton, CEventsEdit, CeventsListBox:

Para los eventos, debe haber algún código que responde a un Windows evento--digamos, un clic del botón--y genera un evento para el motor de secuencias de comandos. (Recuerde que un evento es un envío Invoke en una interfaz controlada los puntos de conexión en el objeto host). Para ello, en este ejemplo agregar controladores de mensajes estándar de MFC en objetos derivados de las distintas clases. Cada uno de estos controladores simplemente tiene que llamar a FireEvent (cortesía del código agregado a CCmdTargetPlus) en el objeto de envío. Todo lo demás sucede automáticamente.

Dado que el objeto de envío y el objeto de ventana real de MFC son independientes en este ejemplo, el primario de diálogo necesita explícitamente enlazar los dos juntos. Esto se realiza en el constructor Mfcaxscrvbdlg.

Elementos con nombre

Una vez que tiene objetos de distribución, tendrá que configurarlas para que el motor de secuencias de comandos sepa acerca de ellos. La colección de todos los objetos de envío con nombre que conozca el motor de secuencias de comandos se denomina "Namespace Script". Se agregan elementos al espacio de nombres secuencia de comandos mediante el método IActiveScript::AddNamedItem. Como mencioné anteriormente, deber del host es implementar una IDispatch para el objeto y tipo de información a través de ITypeInfo de soporte técnico para el objeto. Cuando el motor de secuencias de comandos necesita resolver una referencia a un elemento con nombre, utiliza el método IActiveScriptSite::GetItemInfo para solicitar un puntero IUnknown (que consulta principalmente de IDispatch) y un puntero ITypeInfo.

No todo lo que un host desea ser secuencias de comandos debe ser un elemento con nombre. Normalmente, el host tendrá una jerarquía de objetos, donde subobjetos son accesibles a través de un objeto de nivel superior. Una metáfora común es la aplicación-> documento-> jerarquía de artículos, donde el objeto Document es accesible desde el objeto de aplicación de nivel superior como una propiedad IDispatch del propio objeto Application. En la misma manera, el propio objeto Document expone varios subobjetos y cada uno es un elemento que pueden obtener a través de una matriz de elementos o otro contrivance.

Mediante este esquema, el motor de secuencias de comandos es lo suficientemente inteligente para desplazarse a un subelemento cuando el código de secuencia de comandos dice lo siguiente sin necesidad de documento o elemento que se agregará al espacio de nombres secuencia de comandos:
Set Obj = Application.Document.Item(1)
				
tan largo como el subobjeto se expone como propiedades get de su objeto primario, el motor de secuencias de comandos encuentra correctamente. Curiosamente, el motor de secuencias de comandos es capaz de "asumir" el elemento en la jerarquía de nivel superior. Esto significa que si aplicaciones está declarada como el elemento de nivel superior, a continuación, es suficiente decir lo siguiente para el código anterior secuencia de comandos:
Set Obj = Document.Item(1)
				
trata exactamente cómo Internet Explorer 3.0 permite código de secuencia de comandos en el contexto del objeto Window sin prefijo siempre todas las referencias a objetos con "Ventana". Un host de secuencias de comandos necesita identificar el elemento de nivel superior de la secuencia de comandos de la llamada a AddNamedItems mediante el indicador SCRIPTITEM_GLOBALMEMBERS. Lo que normalmente no hace desactive documentación de secuencias de comandos ActiveX, sin embargo, es que sólo se denomina elementos puede admitir eventos. Utilizando el ejemplo anterior, hay ninguna sintaxis para decir lo siguiente para controlar un evento en un elemento determinado:
   Sub Application.Document.Item(1)_OnEvent ' this doesn't work!
				
tan, para MfcAxscrvbdlg, porque queremos controlar los eventos de cada objeto en la jerarquía, cada objeto se agrega como un elemento con nombre. Cada objeto también es accesible mediante el objeto scripter nivel superior (el cuadro de diálogo propio), que no admite eventos actualmente.

Control WebBrowser:

En este ejemplo, el host de secuencias de comandos expone sólo un objeto externo al espacio de nombres secuencia de comandos. Éste es el control WebBrowser control contención compatibilidad MFC predeterminadas alojado en el cuadro de diálogo. Todo lo que necesita es un AddRef debería enviar puntero al control y se va a establecer. Para eventos, el objeto externo debe exponer un puntero ITypeInfo de algún modo. MfcAxscrVb esto obtiene IProvideClassInfo::GetClassInfo. Como último recurso, un host podría leer la información del objeto tipo-para exponer ITypeInfo. Afortunadamente, el control de WebBrowser admite GetClassInfo, modo MfcAxscrVb no hacerlo.

Si desea agregar otros objetos de automatización externa al espacio de nombres, todo lo que normalmente es necesario es obtener una interfaz IUnknown con CoCreateInstance. Como alternativa, el host puede admitir un medio genérico para obtener objetos externos, aunque tienen las que no es necesario que controlan eventos. En Visual Basic, la función para hacer esto se denomina CreateObject.

Introducción a otras aplicaciones: HostCreateObject

Distinto del conjunto de propiedades utilizadas para exponer todos los objetos secundarios, el objeto scripter principal (la clase de diálogo propio) expone sólo un método especial. Este método muestra que un medio sencillo para simular la función CreateObject de VB. Tenga en cuenta que el método se denomina HostCreateObject Resalte que este método no se proporciona de forma gratuita por el motor de secuencias de comandos, pero el host debe implementarlo propio. Algunos hosts claramente no desea proporcionar esta capacidad por motivos de seguridad, Ie3 es un buen ejemplo. El objetivo principal de HostCreateObject es devolver el puntero de envío del objeto solicitado. Una vez que el motor de secuencias de comandos tiene el puntero de envío, sabe qué hacer desde allí.

Nota : como de la versión 2.0, los motores de VBScript y JScript admiten ahora CreateObject como una función integrada. El host no es necesario implementar esta función. Esta función, sin embargo, probará un objeto para realizar que sea seguro para secuencias de comandos antes de permitir que el objeto que se va a utilizar. Objetos propios considerar seguros para secuencias de comandos por compatibilidad con la interfaz IObjectSafety o marcar las entradas de registro de categoría de componente apropiadas para seguros para scripting. Consulte en Microsoft Knowledge Base para obtener más información.

Soporte de Asistente de clase

El bit de poco último de argucias en MfcAxscrVb es las manipulaciones realizadas para que admita ClassWizard. Asistente para la clase, técnicamente no es "tontos". Mentally sólo se pide. Es muy conveniente para qué lo hace, pero recuerde que ciegamente sólo busca archivos buscando esos comentarios pero especiales. Si sigue el formato de COleControl, puede acerca de la ubicación get con el uso de ClassWizard automatización y eventos fichas.

Una complicación es que MfcAxscrVb utiliza derivación en la parte de su jerarquía de objetos. Todos los objetos de botón se derivan de un objeto CButtonDispatch común que expone propiedades y métodos, que todos los cuales individualmente admitiría. Sin embargo, cuando llega el momento para rellenar el archivo .odl, cada objeto necesita contener todas las propiedades y métodos de la clase primaria. No hace falta decir que esto va a confundir el Asistente para clases cuando llega el momento para numerar los DISPID. Si utilizar Asistente para clases, asegúrese de comprobar los DISPID generados en dos lugares: el archivo .odl para la clase de automatización y la enumeración dentro de la definición de clase. Cuando se trabaja con las clases de botón derivado, es fácil ver el mismo DISPID asignado a varias propiedades y métodos. Es mucho más fácil corregir los DISPID, sin embargo, que agregar todo por cero, por lo tanto, la funcionalidad se ha dejado en MfcAxscrVb.

Con compatibilidad mejorada Visual C++ 5.0 de IDL métodos y propiedades a través de ClassView, es un indeseado copia si es necesario pero o no. Pero MfcAxscrVb, se admite por ahora. Disfrute.

Apéndice A: modelo de objetos

creador de secuencias de comandos:

Este es el objeto principal de la que derivan todos los demás objetos. Es "IMfcaxscrvbDlg" en el archivo .odl pero se agrega como el elemento con nombre "Scripter." Tiene un método, HostCreateObject, que se describe anteriormente.

objetos de botón:

AButton BButton, RunScript CancelButton, OKButton,

Propiedades
  • Título: Texto de cara del botón.
métodos Presione: Funciona como si se insertaron en el botón.
  • Presione: Funciona como si se insertaron en el botón.
eventos
  • OnClick: Desencadenados cuando se inserta el botón.
  • OnMouseOver: Desencadenados cuando gira el mouse (ratón) sobre el botón.
  • OnFocus(bSet): Desencadenados cuando se proporciona foco o tomado del botón.
BroCon:

BroCon es el nombre del control WebBrowser en el cuadro de diálogo. Admite todas las propiedades y métodos tal como se documenta en Internet Client SDK/ActiveX SDK para el control WebBrowser.

EditCon:

métodos
  • AppendLine(strToAdd): Agrega strToAdd al final de la ventana de edición de texto.
  • InsertLine (strToAdd, nCuando): agrega strToAdd en línea #nWhere.
  • RemoveLine(nWhere): Quita # nWhere línea ventana de edición.
eventos
  • OnMouseOver: Desencadenados cuando gira el mouse (ratón) encima de la ventana.
  • OnChar(strChar): Desencadenados cuando se introduce caracteres strChar en ventana.
  • OnFocus(bSet): Desencadenados cuando se proporciona foco o tomado del botón.
Lbox:

métodos
  • AddString(strIn): Agrega la cadena en el cuadro de lista.
  • ClearList: Borra todas las cadenas del cuadro de lista.
  • RemoveString(strRemove): Quita la primera instancia de StrRemove y lo quita del cuadro de lista.
  • SelectString(strSelect): Selecciona la cadena especificada por strSelect.
eventos
  • OnMouseOver: Desencadenados cuando gira el mouse (ratón) encima de la ventana.
  • OnFocus(bSet): Desencadenados cuando se proporciona foco o tomado del botón.
  • OnSelCancel(strCancelled): Cuando selección se ha cancelado en un strCancelled de elemento de cuadro de lista.
  • OnSelChange(strChange): Cuando un strChange de elemento de cuadro de lista está seleccionado por el usuario.

Propiedades

Id. de artículo: 168214 - Última revisión: domingo, 9 de febrero de 2014 - Versión: 2.2
La información de este artículo se refiere a:
  • Microsoft Internet Explorer 3.01
  • Microsoft Internet Explorer 3.02
  • Microsoft Internet Explorer 4.0 128-Bit Edition
  • 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 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional
Palabras clave: 
kbnosurvey kbarchive kbmt kbdownload kbfile kbinfo kbsample KB168214 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 168214

Enviar comentarios

 

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