C/Visual C - Instanciar librerias ActiveX desde App de consola

 
Vista:

Instanciar librerias ActiveX desde App de consola

Publicado por Ricardo (1 intervención) el 07/05/2003 12:48:45
Tengo un Servicio NT (aplicación de consola) en el que tengo que utilizar una librería ActiveX desarrollada en VB6. Mi problema es que no puedo instanciar un objeto de la librería, al llamar a la función CreateDispatch esta retorna con error. La pregunta es: ¿Sabeis como puedo instanciar un objeto de la librería?. Gracias por anticipado
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Instanciación de objetos ActiveX en un servicio NT

Publicado por Alejandro (1153 intervenciones) el 23/05/2025 00:41:41
Instanciar un objeto de una librería ActiveX en un servicio NT puede ser complicado debido a las diferencias en el contexto de ejecución y los permisos. Aquí hay algunos pasos y consideraciones que pueden ayudarte a resolver el problema con `CreateDispatch`:

1. Verifica los permisos:
- Asegúrate de que el servicio NT tenga los permisos adecuados para acceder a la librería ActiveX. Los servicios suelen ejecutarse bajo cuentas de sistema que pueden no tener acceso a ciertos recursos. Considera ejecutar el servicio bajo una cuenta de usuario que tenga los permisos necesarios.

2. Registra la DLL:
- Asegúrate de que la librería ActiveX esté correctamente registrada en el sistema. Puedes hacer esto utilizando el comando `regsvr32` en la línea de comandos:
1
regsvr32 ruta\de\tu\libreria.ocx

3. Utiliza CoInitialize:
- Antes de llamar a `CreateDispatch`, asegúrate de inicializar la biblioteca COM utilizando `CoInitialize` o `CoInitializeEx`. Esto es crucial para que el servicio pueda interactuar con objetos COM. Aquí tienes un ejemplo:
1
2
3
4
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
    // Manejo de errores
}

4. Verifica el tipo de aplicación:
- Asegúrate de que la librería ActiveX sea compatible con el entorno en el que se está ejecutando el servicio. Algunas librerías ActiveX pueden estar diseñadas para ser utilizadas en aplicaciones de escritorio y pueden no funcionar correctamente en un servicio.

5. Manejo de errores:
- Asegúrate de manejar correctamente los errores que puedan surgir al llamar a `CreateDispatch`. Puedes utilizar `GetLastError` para obtener más información sobre el error específico que se está produciendo.

6. Ejemplo de código:
Aquí tienes un ejemplo básico de cómo instanciar un objeto ActiveX en un servicio NT:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <comdef.h>
 
int main() {
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr)) {
        // Manejo de errores
        return -1;
    }
 
    IDispatch *pDisp = NULL;
    hr = CoCreateInstance(CLSID_YourActiveXClass, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pDisp);
    if (SUCCEEDED(hr)) {
        // Utiliza el objeto ActiveX
        pDisp->Release();
    } else {
        // Manejo de errores
    }
 
    CoUninitialize();
    return 0;
}

7. Consideraciones adicionales:
- Si el servicio necesita interactuar con la interfaz de usuario (por ejemplo, mostrar cuadros de diálogo), ten en cuenta que los servicios NT no tienen acceso a la interfaz de usuario de forma predeterminada. Esto puede causar problemas al intentar utilizar ciertas funcionalidades de ActiveX.

Si después de seguir estos pasos sigues teniendo problemas, considera revisar la documentación de la librería ActiveX para ver si hay requisitos específicos o limitaciones al utilizarla en un servicio NT. También puede ser útil buscar en foros o comunidades de desarrolladores que hayan enfrentado problemas similares. ¡Espero que esto te ayude a resolver tu problema, Ricardo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar