Automatización en Visual C++
Última modificación el Viernes, 24 abril 2009 08:04 Autor: ProgramadorWeb Lunes, 18 agosto 2008 08:00
Automatización en Visual C++

Al igual que ocurre con C++ Builder, Visual C++ dispone de una clase que, hasta cierto punto, simplifica la programación de controladores de automatización. Dicha clase es COleDispatchDriver y, aunque permite las mismas operaciones que la clase Variant de C++ Builder, su uso es algo más complejo. Esto se debe a que la clase Variant de C++ Builder se ocupa de muchos de los detalles de bajo nivel relativos al mecanismo de automatización, como la resolución de nombres y el empaquetado de parámetros, mientras que la clase COleDispatchDriver nos deja a nosotros esas tareas.
El equivalente a CreateObject() en la clase COleDispatchDriver es CreateDispatch(). Necesita dos parámetros: el identificador de automatización y un objeto COleException donde devolver información de posibles errores. Internamente, los métodos y propiedades de un componente automatizable son reconocidos mediante identificadores y no con nombres descriptivos, como FileSaveAs. Cada vez que necesitemos usar un método tendremos que obtener ese identificador de alguna manera.
Uno de los miembros de la clase COleDispatchDriver, llamado m_lpDispatch, permite acceder directamente a la interfaz IDispatch del objeto automatizable. Esa interfaz cuenta con un método GetIDsOfNames() que, facilitándole el nombre de un método o propiedad, nos facilita el correspondiente identificador.
Disponiendo ya del identificador, lo único que hay que hacer es llamar al método InvokeHelper() de la clase COleDispatchDriver. Los parámetros necesarios son: el identificador, una constante indicando si se trata de un método, una lectura de propiedades, una asignación a propiedad, etc., una constante indicando el tipo del valor de retorno, un puntero a la variable donde se almacenará ese valor, una matriz con los tipos de los parámetros y, finalmente, una lista variable con esos parámetros.
Lo mejor es ver en la práctica cómo hacer exactamente lo mismo que en el truco anterior: crear un documento de Word e insertar un texto en él. El código necesario sería el siguiente:
COleDispatchDriver Word;
COleException * Excepcion =
new COleException;
CoInitialize(NULL); // Inicializamos COM
// y creamos el objeto
Word.CreateDispatch(
“Word.Basic”, Excepcion);
DISPID disp;
BYTE Tipos[] = VTS_BSTR;
LPOLESTR Metodo;
// Llamamos al método AppShow
Metodo = L”AppShow”;
// Recuperamos el dispid del método
Word.m_lpDispatch->GetIDsOfNames(
IID_NULL, &Metodo, 1,
GetUserDefaultLCID(), &disp);
// y lo ejecutamos
Word.InvokeHelper(disp,
DISPATCH_METHOD,
VT_EMPTY, NULL, NULL);
// Lo mismo con el método FileNew
Metodo = L”FileNew”;
Word.m_lpDispatch->GetIDsOfNames(
IID_NULL, &Metodo, 1,
GetUserDefaultLCID(), &disp);
Word.InvokeHelper(disp,
DISPATCH_METHOD,
VT_EMPTY, NULL, NULL);
// Para Insert es necesario facilitar
Metodo = L”Insert”;
Word.m_lpDispatch->GetIDsOfNames(
IID_NULL, &Metodo, 1,
GetUserDefaultLCID(), &disp);
// un parámetro
Word.InvokeHelper(disp,
DISPATCH_METHOD,
VT_EMPTY, NULL, Tipos,
“Texto insertado desde Visual C++”);
Como puede ver, el código es considerablemente más extenso y complejo que en el caso de C++ Builder, aunque el resultado final es el mismo.
Tanto Visual C++ como C++ Builder son capaces de simplificar el uso de aplicaciones automatizables siempre que dispongamos de una librería de tipos. Usando la opción adecuada del entorno, esa librería de tipos se importa y genera una clase que permite trabajar con la aplicación de una manera mucho más sencilla.
Si te ha parecido interesante únete a nuestra comunidad de FACEBOOK y compartelo con tus amigos.
