IDispatch


IDispatch

The IDispatch interface was designed to call a function using COM. The code shown below shows this interface, it has four functions: GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, and Invoke.
La interface IDispatch fué diseñada para llamar una función usando COM. El código de abajo muestra esta interface, ésta tiene cuatro funciones: GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, e Invoke.

OAIdl.h
IDispatch : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
__RPC__out UINT *pctinfo) = 0;// [out]

virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
UINT iTInfo, // [in]
LCID lcid, // [in]
__RPC__deref_out_opt ITypeInfo **ppTInfo) = 0;// [out]

virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
__RPC__in REFIID riid, // [in]
__RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,// [size_is][in]
__RPC__in_range(0,16384) UINT cNames, // [range][in]
LCID lcid, // [in]
__RPC__out_ecount_full(cNames) DISPID *rgDispId) = 0; // [size_is][out]

virtual HRESULT STDMETHODCALLTYPE Invoke(
_In_ DISPID dispIdMember, //[in]
_In_ REFIID riid, // [in]
_In_ LCID lcid, // [in]
_In_ WORD wFlags, //[in]
_In_ DISPPARAMS *pDispParams, //[out][in]
_Out_opt_ VARIANT *pVarResult, //[out]
_Out_opt_ EXCEPINFO *pExcepInfo, //[out]
_Out_opt_ UINT *puArgErr) = 0; //[out]
};


Tip
GetTypeInfoCount and GetTypeInfo are used to know programmatically what functions are implemented in the interface. They can also be used to know the name and data type of each parameter of a function.
GetTypeInfoCount y GetTypeInfo son usadas para conocer desde un programa que funciones son implementadas en la interface. Estas también pueden ser usadas para conocer el nombre y tipo de datos de cada parámetro en una función.

Tip
To call a function
  1. You must call GetIDsOfNames to get the ID of the function
  2. You must call Invoke using the ID of the function to execute the function
As smart pointers, the compiler and Wintempla provide support for the IDispatch interface, you do not have to worry about these functions.
Para llamar a una función
  1. Usted debe llamar GetIDsOfNames para conseguir el ID de la función
  2. Usted debe llamar Invoke usando el ID de la función para ejecutar la función
Como los punteros inteligentes, el compilador y Wintempla proporciona apoyo para la interface IDispatch, usted no tiene que preocuparse acerca de estas funciones.

Problem 1
Create a Wintempla Dialog application called MsDisplay to display the functions of Microsoft Word. Note that some functions take or return a USERDEFINED value, in most cases it can be a short value (representing an enum constant value) or any COM object (Com::Object).
Cree una aplicación de Dialog usando Wintempla llamada MsDisplay para mostrar las funciones de Microsoft Word. Note que algunas funciones toman o regresan un valor USERDEFINED, en la mayoría de los casos, este puede ser un valor del tipo short (que representa un valor constante del tipo enum) o cualquier objeto COM (Com::Object).

MsDisplay.h
#pragma once //______________________________________ MsDisplay.h
#include "resource.h"
class MsDisplay: public Win::Dialog
{
public:
     MsDisplay()
     {
          ::CoInitialize(NULL);
     }
     ~MsDisplay()
     {
          ::CoUninitialize();
     }
protected:
     ...
};


MsDisplay.cpp
...
void MsDisplay::Window_Open(Win::Event& e)
{
     Com::Object Application;
     try
     {
          Application.CreateInstance(L"Word.Application", true);
          Com::Container::DisplayInterfaceFunctions(hWnd, Application);
          Application.Method(L"Quit");
     }
     catch(Com::Exception excep)
     {
          excep.Display(hWnd, L"MsDisplay");
          Application.Method(L"Quit");
     }
}


WordApplicationFunctions

Tip
The program begins the creating an instance of Microsoft Word. The functions of the default interface are displayed. Then, the program closes Microsoft Word. Even though Word is not visible during the execution of the program, it was open; you may verify this using the task manager. To display Word, you must set the Visible property to true in your code.
El programa comienza creando una instancia de Microsoft Word. Las funciones de la interface de defecto son mostradas. Entonces, el programa cierra Microsoft Word. Aunque Word no es visible durante la ejecución del programa, este fue abierto; usted puede verificar esto usando el administrador de tareas. Para mostrar Word, usted debe fijar la propiedad Visible a true en su código.

Problem 2
Modify the program of the previous problem to display Microsoft Word.
Modifique el programa del problema anterior para mostrar Microsoft Word.

MsDisplay.cpp
...
void MsDisplay::Window_Open(Win::Event& e)
{
     Com::Object Application;
     try
     {
          Application.CreateInstance(L"Word.Application", true);
          Application.Put(L"Visible", true);
          Com::Container::DisplayInterfaceFunctions(hWnd, Application);
          Application.Method(L"Quit");
     }
     catch(Com::Exception excep)
     {
          excep.Display(hWnd, L"MsDisplay");
          Application.Method(L"Quit");
     }
}


Visible

© Copyright 2000-2021 Wintempla selo. All Rights Reserved. Jul 22 2021. Home