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.

¿Fue útil?

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)

  1. Ejecutar Excel, crear un archivo nuevo, si no ha hecho esto para usted
  2. 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...

  1. A partir de la Tools menú, seleccione References
  2. 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.
  3. A partir de la Insert menú, seleccione UserForm
  4. En el flotante Toolbox de la ventana, haga clic derecho y seleccione Additional Controls
  5. Encontrar el OCX en la lista y marque esa opción
  6. A continuación, puede arrastrar el OCX desde el cuadro de herramientas hasta el formulario de usuario
  7. A partir de la Run menú ejecutar.
  8. Prueba de su OCX y jugar con ella.

  9. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top