El uso de un ocx en una aplicación de consola
-
09-06-2019 - |
Pregunta
Quiero probar rápidamente un ocx.¿Cómo puedo dejar que ocx en una aplicación de consola.He encontrado algunos tutoriales en CodeProject y pero están incompletos.
Solución
Seguro..es bastante fácil.He aquí una divertida aplicación que lanzó junto.Estoy asumiendo que usted tiene Visual C++.
Guardar para test.cpp y compilar:cl.exe /EHsc test.cpp
Para probar con el OCX necesitará #de importación de la biblioteca de tipos y el uso es la CLSID (o simplemente codificar el CLSID) en la llamada de CoCreateInstance.El uso de #import también ayudará a definir las interfaces personalizadas que usted puede ser que necesite.
#include "windows.h" #include "shobjidl.h" #include "atlbase.h" // // compile with: cl /EHsc test.cpp // // A fun little program to demonstrate creating an OCX. // (CLSID_TaskbarList in this case) // BOOL CALLBACK RemoveFromTaskbarProc( HWND hwnd, LPARAM lParam ) { ITaskbarList* ptbl = (ITaskbarList*)lParam; ptbl->DeleteTab(hwnd); return TRUE; } void HideTaskWindows(ITaskbarList* ptbl) { EnumWindows( RemoveFromTaskbarProc, (LPARAM) ptbl); } // ============ BOOL CALLBACK AddToTaskbarProc( HWND hwnd, LPARAM lParam ) { ITaskbarList* ptbl = (ITaskbarList*)lParam; ptbl->AddTab(hwnd); return TRUE;// continue enumerating } void ShowTaskWindows(ITaskbarList* ptbl) { if (!EnumWindows( AddToTaskbarProc, (LPARAM) ptbl)) throw "Unable to enum windows in ShowTaskWindows"; } // ============ int main(int, char**) { CoInitialize(0); try { CComPtr<IUnknown> pUnk; if (FAILED(CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**) &pUnk))) throw "Unabled to create CLSID_TaskbarList"; // Do something with the object... CComQIPtr<ITaskbarList> ptbl = pUnk; if (ptbl) ptbl->HrInit(); HideTaskWindows(ptbl); MessageBox( GetDesktopWindow(), _T("Check out the task bar!"), _T("StackOverflow FTW"), MB_OK); ShowTaskWindows(ptbl); } catch( TCHAR * msg ) { MessageBox( GetDesktopWindow(), msg, _T("Error"), MB_OK); } CoUninitialize(); return 0; }
Otros consejos
No es un OCX Control de Usuario?(algo que se pone en un formulario para que el usuario interactúe con)?
La forma más fácil que conozco de prueba COM/ActiveX cosas es el uso de excel.(Sí, sé que suena tonto, bear with me)
- Ejecutar Excel, crear un archivo nuevo, si no ha hecho esto para usted
- Pulse
Alt+F11
para iniciar el Editor de Visual Basic (si tienes excel 2007 es en el 'Desarrollador' ficha de la cinta de cosa
Ahora que estás en la feliz visual basic de la tierra...
- A partir de la
Tools
menú, seleccioneReferences
- Seleccione su OCX/objeto COM de la lista, o haga clic en
Browse...
para encontrar el archivo si no está registrado con COM - Usted puede ser capaz de saltar este paso si su OCX ya está registrado. - A partir de la
Insert
menú, seleccioneUserForm
- En el flotante
Toolbox
de la ventana, haga clic derecho y seleccioneAdditional Controls
- Encontrar el OCX en la lista y marque esa opción
- A continuación, puede arrastrar el OCX desde el cuadro de herramientas hasta el formulario de usuario
- A partir de la
Run
menú ejecutar. Prueba de su OCX y jugar con ella.
GUARDAR EL ARCHIVO de EXCEL para que usted no tenga que repetir estos pasos cada vez.
@orion eso es tan cool.Nunca lo pensé de esa manera.
Bien @jschroedl eso fue muy divertido de hecho.
Las pruebas de un control activex en aplicación de consola, es divertido.Pero creo que vale la pena no intentarlo por ese camino.Usted puede llamar a los métodos o establecer y obtener las propiedades, ya sea a través de la forma @jschroedl había explicado o puede llamar a la interfaz IDIspatch objeto a través de la función Invoke.
El primer paso es GetIDsByName y llamar a la función a través de Invocar y parámetros para la función debe ser una serie de VARIANTES en el Invocar formal de la lista de parámetros.
Todo está bien y dandy.Pero una vez llegas a los eventos de su cuesta abajo desde allí.Aplicación de Windows requiere un mensaje de que la bomba de fuego de eventos.En una consola que no tiene uno.Me fui por el camino de implementar un EventNotifier para los eventos como implementar una interfaz de devolución de llamada en el clásico de C++ manera.Pero los acontecimientos no llegar a su interfaz implementada.
Estoy bastante seguro de que esto no se puede hacer en una aplicación de consola.Pero estoy realmente esperando que alguien por ahí tiene una opinión diferente sobre los eventos en una aplicación de consola