Estamos obligados a utilizar un control ActiveX de terceros.Control ActiveX sin formulario
El único problema es que la capa de nuestro software es una capa empresarial y no tiene acceso a una ventana o formulario. También se ejecuta en hilos separados (y debería funcionar desde cualquier hilo) que no sean STA.
En lugar de romper nuestra separación de la interfaz de usuario de la lógica de negocio, que utilizan esta solución para hacer que funcione:
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Entonces cada vez que necesitemos para hacer referencia al control, nos llaman _myActiveX.BeginInvoke()
o Invoke()
.
Al desechar esta clase (al salir de nuestra aplicación), desechamos el control y abortamos el hilo.
Mi pregunta es, ¿hay algún problema con esto? ¿Hay una mejor manera de manejar esto?
¿Existe una mejor manera de trabajar con un control ActiveX desde un entorno desconocido de subprocesos múltiples? Estamos tratando de escribir nuestra clase de una manera que envuelva el control, pero funcionará desde cualquier hilo.
ACTUALIZACIÓN: Como respuesta sugerida, preferiríamos usar el objeto COM estándar y no usar ningún control. Nuestro problema con eso era que obtendríamos el error "(Excepción de HRESULT: 0x8000FFFF (E_UNEXPECTED)" sobre el primer método o propiedad que llamamos al objeto COM. Este es un error bastante genérico que no obtenemos al usar el ActiveX , cualquier idea?
ACTUALIZACIÓN: Nuestro ocx es "CX25.ocx", utilizando tlbimp.exe obtenemos CX25Lib.dll. Con aximp.exe, obtenemos AxCX25Lib.dll y CX25Lib.dll. CX25Lib.dll no funciona en ambos casos. AxCX25Lib.dll funciona.
El código anterior que menciono está funcionando. ¿Alguien ha tenido que usar un control ActiveX sin un formulario? ¿O alguien ha tenido problemas al usar el objeto COM estándar, pero notó que ActiveX funciona? – jonathanpeppers
¿Encontró una solución para esto? Sospecho que el enfoque correcto depende de si espera o no devoluciones de llamada/eventos del control, ya que dependería de una bomba de mensajes de Windows para manejarlos. – Tormod
Sí, el código anterior funciona. Lo hemos estado utilizando durante más de un año sin problemas. También lo usamos con múltiples bibliotecas COM. Terminamos envolviéndolo en una clase e implementamos Invoke/BeginInvoke para interactuar con el control, que es obligatorio. – jonathanpeppers