delphi winapi com delphi-7

delphi - Enhebrado, com+llamadas con mensajes de SendMessage



winapi delphi-7 (1)

Tengo una aplicación que crea un hilo que se comunica con la interfaz de usuario principal a través de mensajes de Windows. Simplemente envía el mensaje al hilo principal de la aplicación y recibe el estado.

De esa manera estoy mostrando ventanas modales y hago otras cosas.

El problema es cuando tengo que mostrar un formulario que realiza una llamada a un servidor com +. De esa forma obtengo el error OLE 8001010D: No se puede realizar una llamada saliente dado que la aplicación está despachando una llamada síncrona de entrada.

Creo que sucede porque el SendMessage primario está en uso y las llamadas com + necesitan mensajes de Windows para sus tareas.

De todos modos, en Delphi no puedo mostrar el formulario de un hilo, pero ¿cómo puedo resolver el problema ...?

Gracias

EDITAR:

  1. PRINCIPAL (UI) 2. UN HILO

A. Un hilo (2) envía un mensaje a un hilo principal (1) B. El hilo principal (1) recibe el mensaje y antes de permitir que regrese a un hilo, muestra la ventana. C. La ventana modal en el hilo principal quiere hacer una llamada com +, se produce el error anterior.

  1. ¿En qué hilo está la ventana modal? 2. ¿De qué hilo proviene la llamada COM? 3. ¿En qué subproceso se ha instanciado el objeto COM? 4. ¿Se inicializó el hilo de fondo con una STA? 5. ¿Se muestra el formulario modal desde un controlador SendMessage? - Roman R. hace 2 minutos

    1. PRINCIPAL
    2. PRINCIPAL
    3. PRINCIPAL
    4. CoInitializeEx (nil, COINIT_MULTITHREADED);
    5. sí.

La causa del problema proviene de la incapacidad de COM para organizar una llamada COM saliente al procesar la solicitud SendMessage . El error que aparece es RPC_E_CANTCALLOUT_ININPUTSYNCCALL (0x8001010D) , a lo que se refiere. Estaba bajo la impresión de que esto solo se aplica a las llamadas a SendMessage que son parte de las solicitudes COM entrantes entrantes, sin embargo, esto podría haber sido una suposición falsa.

Su solución típica sería reemplazar su SendMessage con PostMessage seguido de esperar el objeto de sincronización, evento o semáforo. De esta manera, el hilo de fondo de llamadas no retiene los mensajes para sincronizar las llamadas y espera de forma autónoma, en el hilo principal el mensaje que se envía a través de la cola de mensajes normal y, finalmente, llega al mismo controlador.

Como beneficio adicional, tiene la opción de finalizar de forma segura el hilo de fondo. Si actualmente está siendo bloqueado por la API de SendMessage esperando el diálogo modal, el cambio sugerido le permitirá señalar el objeto de sincronización desde el hilo principal y dejarlo seguir ejecutándose, por ejemplo, si desea terminarlo de manera segura.

Una solución alternativa podría ser llamar a la función InSendMessage y, si es verdadero, diferir la IU modal, por ejemplo, al publicar un mensaje en uno mismo para mostrar el formulario en otro manejador de mensajes más tarde.