Utilizar Visual C++ de automatización de Office

Seleccione idioma Seleccione idioma
Id. de artículo: 196776 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo responde a preguntas comunes relativas a la automatización para Microsoft Office desde Visual C++.

Más información

Tabla de contenido

  1. Qué es la automatización
  2. ¿Soy nuevo en automatización, dónde se puede encontrar buenos recursos para obtener más información?
  3. ¿Hay diferentes formas en puede usar automatización?
  4. ¿Qué es COM?
  5. ¿Cómo adjuntar a la instancia de ejecución de una aplicación de Office?
  6. Pasar parámetros opcionales
  7. ¿Cómo capturar eventos expuestos por las aplicaciones de Office?
  8. Mi código de automatización es demasiado lenta. ¿Cómo se puede acelerar las cosas?
  9. ¿Qué significan estos valores de error grandes, como-2147352573 o 0x80030002?
  10. ¿Qué es una biblioteca de tipo?
  11. Mi código de automatización trabajado con Microsoft Excel 95, pero se produce un error con Microsoft Excel 97. ¿Por qué?
  12. ¿Por qué la aplicación que estoy automatizar permanezcan en la memoria al finalizar mi programa?
  13. ¿Sé lo que quiero hacer como usuario de aplicación de Microsoft Office, pero cómo hacerlo mediante programación mediante automatización?
  14. ¿Puede automatizar una aplicación de Microsoft Office incrustada?
  15. ¿Cómo obtengo acceso a Mis propiedades de documentos en un documento de Microsoft Office?

Preguntas y respuestas

  1. Qué es la automatización

    Automatización (anteriormente automatización OLE) es una tecnología que permite aprovechar la funcionalidad del programa existente e incorporar en sus propias aplicaciones. Por ejemplo, puede utilizar la ortografía de Microsoft Word y la gramática capacidades en su aplicación sin visible para los usuarios de Microsoft Word. Puede utilizar incluso todas las herramientas de análisis de gráficos, impresión y datos de Microsoft Excel. Esta tecnología enormemente puede simplificar y acelerar el desarrollo.
  2. ¿Soy nuevo en automatización, dónde se puede encontrar buenos recursos para obtener más información? Capítulo 24 de "En Visual C++ de David Kruglinski" (ISBN:1 - 57231 - 565 - 2) proporciona una visión general, así como algunos ejemplos excelentes. Además, Microsoft Knowledge Base es una buena fuente de información. En este artículo propio es un buen comienzo, y puede encontrar referencias más específicas en el siguiente artículo en Microsoft Knowledge Base:
    152023Buscar recursos a la automatización OLE de ejemplo
    Si prefiere aprendizaje por ejemplo, consulte en contacto con el siguiente artículo en Microsoft Knowledge Base:
    179706CÓMO usar MFC para automatizar Excel y crear o formato un nuevo libro
  3. ¿Hay diferentes formas en puede usar automatización?

    Hay tres formas básicas puede utilizar automatización: MFC, # import y C/C ++:

    • Con MFC, utilice el Asistente para clases C++ Visual para generar "clases de contenedor" de bibliotecas de tipo Microsoft Office. Estas clases, así como otras clases de MFC, como COleVariant COleSafeArray, COleException, simplifican las tareas de automatización. Este método normalmente se recomienda a través de los demás y la mayoría de los ejemplos de Microsoft Knowledge Base utiliza MFC.
    • # import, una nueva directiva que estuvo disponible con Visual C++ 5.0, se crea VC ++ "punteros inteligentes" desde una biblioteca de tipo especificado. Es muy eficaz pero a menudo no se recomienda debido de referencia-recuento problemas que suelen producen cuando se utiliza con las aplicaciones de Microsoft Office.
    • Automatización de C/C ++ es mucho más difícil, pero a veces necesario para evitar sobrecarga con MFC o problemas con # import. Básicamente, se trabaja con estas API como CoCreateInstance() y interfaces COM como IDispatch y IUnknown.
    Es importante observar que existen algunas diferencias pequeñas entre automatización desde C++ comparado con C sin formato, ya que COM se diseñó alrededor de la clase de C++. Para obtener más información, consulte en contacto con el siguiente artículo en Microsoft Knowledge Base para obtener un ejemplo C:
    181473Cómo: Usar automatización OLE desde una aplicación de C
  4. ¿Qué es COM?

    Automatización se basa en el modelo de objetos de componentes (COM). COM es una arquitectura de software estándar basado en interfaces y diseñado para tener código separado en objetos independientes. Considérelo como una extensión de paradigma de programación orientada a objetos (OOP), pero es aplicable para separar las aplicaciones. Cada objeto expone un conjunto de interfaces y toda la comunicación a un objeto, como inicialización, notificaciones y transferencia de datos, se produce a través de estas interfaces.

    COM es también un conjunto de servicios proporcionados por bibliotecas de vínculos dinámicos (DLL) instaladas con el sistema operativo. Automatización utiliza muchos de esos servicios. Un ejemplo es el servicio de "Activación", que empaqueta las llamadas de la aplicación cliente a las funciones miembro de interfaces de aplicación de servidor y los, con sus argumentos a la aplicación de servidor pasa. Resulta que parezca que las interfaces del servidor se exponen en espacio de memoria del cliente, que no es el caso cuando el cliente es un .exe que se ejecuta en su propio espacio de proceso. Cálculo de referencias también obtiene los valores devueltos de métodos del servidor volver límites de proceso y segura en manos de la llamada del cliente. Hay muchos otros servicios esenciales de automatización proporcionados por las diversas bibliotecas COM. Orígenes de información sobre las incluyen "Inside OLE - segunda edición" por Kraig Brockshmidt, ISBN 1-55615-843-2, "Inside COM" por Dale Rogerson - ISBN 1-57231-349-8, y "automatización del manual del programador" ISBN 1-57231-584-9.
  5. ¿Cómo adjuntar a la instancia de ejecución de una aplicación de Office?

    Utilice la API de GetActiveObject(). Servidores de automatización registran en la tabla ROT (tabla de objetos de ejecución), mediante la API RegisterActiveObject(). Pueden obtener los clientes de automatización en la instancia en ejecución con código como:
          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    						
    Nota : si hay varias instancias en ejecución de la aplicación de Office que desea adjuntar, sólo podrá adjuntar a la primera instancia que se inició utilizando la API GetActiveObject().

    En teoría, puede iterar en la ROT para cada instancia individual, pero las aplicaciones de Office no registran si otra instancia ya está en la tabla ROT debido a que el moniker para sí mismo es siempre el mismo (no pueden distinguirse todos modos). Esto significa que no se puede adjuntar a cualquier instancia excepto para la primera. Sin embargo, porque las aplicaciones de Office también registrar sus documentos en la tabla ROT, puede correctamente adjuntar a otras instancias por iteración de la tabla ROT buscando un documento específico, asociarla al depurador, a continuación, obtener el objeto Application de él. No hay código en el artículo de Knowledge Base siguiente para recorrer en iteración la tabla ROT y buscando un nombre de documento:
    190985Cómo: Obtener el IDispatch de Excel o documento de Word desde un OCX
    No necesita hacerlo para PowerPoint, porque es una aplicación de instancia única; sólo puede tener una instancia de en ejecución.
  6. Pasar parámetros opcionales

    Algunos métodos tienen parámetros "opcionales". En Visual Basic, puede azar omitir ellos al llamar al método. Sin embargo, al llamar a con Visual C++ tiene que pasar un VARIANT especial cuyo campo .VT es VT_ERROR y campo .SCODE es DISP_E_PARAMNOTFOUND. Es decir:
          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    						
    es realmente lo que hace Visual Basic entre bastidores.
  7. ¿Cómo capturar eventos expuestos por las aplicaciones de Office?

    Básicamente implemente la interfaz de evento que desee detectar (el "receptor") y configurar una conexión de consulta con la aplicación (el "origen"). El siguiente artículo proporciona ejemplos paso a paso para que Microsoft Word:
    183599Cómo: Catch eventos de aplicación de Microsoft Word97 mediante VC ++
    En general, para configurar la conexión de consulta, obtener IConnectionPointContainer del servidor y llamar a FindConnectionPoint() con el IID de la interfaz de eventos. Esto le proporciona una interfaz IConnectionPoint y todo lo que queda es llamar a Advise() con una instancia de la interfaz de eventos. El servidor volverá a continuación, llamar a través de esta interfaz cuando se produzcan estos eventos.
  8. Mi código de automatización es demasiado lenta. ¿Cómo se puede acelerar las cosas?

    Una causa común de problemas de la velocidad con la automatización es con repetitivas de lectura y escritura de datos. Esto es típico para automatización de Excel de los clientes. Sin embargo, la mayoría de los usuarios no sabrán que estos datos normalmente se pueden escritos o leer simultáneamente mediante SAFEARRAY. Consulte los siguientes artículos de Knowledge Base para obtener más información y ejemplos informativos:
    186120Cómo: Usar MFC para automatizar Excel y rellenar un rango con una matriz
    186122Cómo: Usar MFC para automatizar Excel y obtener una matriz desde un rango
    179706Cómo: Usar MFC para automatizar Excel y crear o formato de un libro nuevo
    Además, es importante señalar a que uso del Portapapeles veces puede mejorar el rendimiento. Por ejemplo, puede copiar los datos en el Portapapeles, a continuación, utilizar automatización para indicar al servidor para pegar. O viceversa; indicar al servidor para copiar al Portapapeles y pegar en la aplicación.
  9. ¿Qué significan estos valores de error grandes, como-2147352573 o 0x80030002?

    Estos valores se conocen como HRESULT y definidos en winerror.h. Los números son tan grandes, porque el primer bit indica si o no es un resultado de error. Puede utilizar la utilidad ErrLook.Exe que se incluye con Visual C++ para convertir estos números en descripciones significativas.

    Si desea obtener una descripción de los errores mediante programación, puede utilizar la API FormatMessage(). Consulte los siguientes artículos de Knowledge Base para obtener más información y ejemplos sobre el uso de FormatMessage():
    186063INFORMACIÓN: Traducido errores de automatización para VB/VBA
    122957SAMPLE: Herramientas de descodificador de código de error OLE Decode32 y Decode16
    Nota : si está utilizando Visual C++ 6.0 y tiene una variable que contiene este valor en la ventana de inspección de depuración, anexar ", hr" (sin las comillas) en él con C++ traducir para!
  10. ¿Qué es una biblioteca de tipo?

    Una biblioteca de tipo es similar a un archivo de encabezado de C o C++. Contiene las interfaces, métodos y propiedades que está publicando un servidor. Puede ver la biblioteca de tipo con OLE/COM Object Viewer (Oleview.exe) que viene con Visual C++. Aquí es una lista de los nombres de biblioteca de tipo de archivo para Microsoft Office 95, 97 y 2000:
    
           Office Application      | Type library
           ------------------------+----------------
           Word 95 and prior       | wb70en32.tlb
           Excel 95 and prior      | xl5en32.olb
           Powerpoint 95 and prior | Powerpoint.tlb
           Access 95 and prior     | msaccess.tlb
           Binder 95               | binder.tlb
           Schedule+               | sp7en32.olb
           Project                 | pj4en32.olb
           Team Manager            | mstmgr1.olb
           Word 97                 | msword8.olb
           Excel 97                | excel8.olb
           Powerpoint 97           | msppt8.olb
           Access 97               | msacc8.olb
           Binder 97               | msbdr8.olb
           Graph 97                | graph8.olb
           Outlook 97              | msoutl8.olb
           Outlook 98              | msoutl85.olb
           Word 2000               | msword9.olb
           Excel 2000              | excel9.olb
           Powerpoint 2000         | msppt9.olb
           Access 2000             | msacc9.olb
           Outlook 2000            | msoutl9.olb
           Word 2002               | msword.olb
           Excel 2002              | excel.exe
           Powerpoint 2002         | msppt.olb
           Access 2002             | msacc.olb
           Outlook 2002            | msoutl.olb 
    
    
    						
  1. Mi código de automatización trabajado con Excel 95, pero se produce un error con Excel 97. ¿Qué sucede?

    El modelo de objetos de Excel había realizado un cambio importante de la versión 95 a 97. Excel 95 implementa sus métodos y propiedades en una sola implementación de IDispatch. Esto significaba que a menudo puede llamar a métodos destinados al objeto X, de objeto Y. Esto no era un buen diseño, por lo que en Office 97, cada objeto tiene su propio separar IDispatch implementación. Esto significa que si se solicita un método o propiedad del objeto X de un objeto independiente Y, obtener el error 0x80020003,-2147352573, "Miembro no encontrado". Para evitar este error, deberá asegurarse de que la interfaz IDispatch subyacente que realiza llamadas de es correcto semánticamente. Consulte los siguientes artículos de Knowledge Base para obtener más información:
    172108Cómo: Solucionar problemas "Miembro no encontrado", 0x80020003 error
  2. La aplicación que estoy automatizar permanece en memoria una vez finalizado el programa. ¿Qué sucede?

    Probablemente, esto es porque has olvidado liberar una interfaz de adquisición y tendrá que realizar el seguimiento hacia abajo. Aquí están algunas sugerencias generales y cosas que busca:

    • Si estás utilizando # import, es muy probable que se podría ejecutar en uno de los errores de recuento de referencia asociados con él. A menudo los errores pueden ser solucionados, pero normalmente se prefiere utilizar uno de los métodos de automatización. # Import no funciona muy bien con las aplicaciones de Office, puesto que sus bibliotecas de tipos y uso son bastante complejos. Además, dichos problemas de recuento de referencia son difíciles de localizar porque mucha las llamadas de COM de nivel de interfaz son segundo plano cuando utilizar # import.
    • Comprobar si se llamar a cualquier métodos, como abrir o nuevo, que devuelven IDispatch * (LPDISPATCH) y se omitirá el valor devuelto. Si, a continuación, se abandonar esta interfaz devuelta y será necesario cambiar el código para que liberarla cuando ya no sean necesarios.
    • Comentar gradualmente secciones de su código hasta que el problema desaparece después agregarla volver con precaución al seguimiento donde comienza el problema.
    • Tenga en cuenta que algunas aplicaciones permanecerá ejecuta si el usuario ha "tocado" la aplicación. Si esto ocurre mientras está automatizando, a continuación, la aplicación probablemente permanecerá ejecuta posteriormente. Las aplicaciones de Office tienen una propiedad de "UserControl" del objeto Application que se pueden leer/escribir para cambiar este comportamiento.
    • Además, algunas aplicaciones decidirá mantenerse ejecutando si suficiente-interfaz de usuario "acción" se ha producido. Si tiene previsto salir de la aplicación, a continuación, llamar a su método Quit() del objeto Application. Word mostrará apagado independientemente de su recuento de referencias cuando se llama a salir. Esto no es el comportamiento esperado de COM. Excel, sin embargo, se correctamente sólo ocultar propio pero seguir ejecutando hasta que se liberan todas las interfaces pendientes. En general, debe liberar todas las referencias pendientes y sólo llamar a Quit() si desea salir de la aplicación.
  3. ¿Sé lo que quiero hacer como usuario de aplicación de Office, pero cómo hacerlo mediante programación a través de automatización?

    ¿Qué le interesa es qué objetos, métodos y propiedades que necesita utilizar. La mejor manera de aprender cómo desplazarse por los modelos de objetos de Word, Excel y PowerPoint, según lo que desea como usuario, es utilizar la grabadora de macros. Simplemente elija Macro\ 'Grabar nueva macro' en el menú Herramientas, ejecutar la tarea que está interesado en y después elija Macro\ 'Detener grabación'. Una vez está hecho grabación, elija Macro\Macros en el menú Herramientas, seleccione la macro grabada, a continuación, haga clic en Edición. Esto le llevará al código de VBA generado que realizará la tarea que ha registrado. Tenga en cuenta la macro grabada no es el mejor código posible en la mayoría de los casos, pero su hace muy bien para un ejemplo rápido.
  4. ¿Puede automatizar una aplicación de Office incrustada?

    Absolutamente. El truco es obtener el puntero IDispatch: se proporciona en el Visual C++ técnico Nota 39 (TN039). Consulte el siguiente artículo de Knowledge Base para obtener un ejemplo paso a paso:
    184663Cómo: Incrustar y automatizar una hoja de cálculo Microsoft Excel con MFC
  5. ¿Cómo obtengo acceso a Mis propiedades de documentos en un documento de Office?

    Las propiedades de documento son accesibles a través de automatización o directamente a través de IPropertyStorage. Los siguientes artículos de Microsoft Knowledge Base muestran cada método:
    179494Cómo: Utilizar automatización para recuperar propiedades integradas del documento
    186898Cómo: Leer las propiedades de documento compuesto directamente con VC ++

Propiedades

Id. de artículo: 196776 - Última revisión: jueves, 13 de marzo de 2008 - Versión: 7.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Project 2000 Standard
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ 5.0 Professional
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Access 97 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Outlook 97 Standard
  • Microsoft Word 97 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Outlook 2000 Standard
  • Microsoft Word 2000 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Outlook 2002 Standard
Palabras clave: 
kbmt kbsweptvs2008 kbautomation kbfaq KB196776 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): 196776

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