Pregunta C # Win Api conexión DDE multiproceso


Tengo la implementación de la función del cliente DDE usando Win Api en C #. Todo funciona bien en caso de que llame DdeInitializeW y DdeConnect en un solo hilo. Específicamente, estas son definiciones de envoltorio:

    [DllImport("user32.dll")]
    protected static extern int DdeInitializeW(ref int id, DDECallback cb, int afcmd, int ulres);

    [DllImport("user32.dll")]
    static extern IntPtr DdeConnect(
        int idInst,             // instance identifier
        IntPtr hszService,      // handle to service name string
        IntPtr hszTopic,        // handle to topic name string
        IntPtr pCC              // context data
        );

Si llamé DdeInitializeW y DdeConnect en diferentes hilos, DdeConnect devuelve el puntero nulo.

Además, si llamé a ambos (conexión DDE establecida) en un hilo, no puedo usar este canal DDE en otro hilo (me estoy poniendo INVALIDPARAMETER Error DDE).

Como dije, todo funciona sin problemas en un solo hilo.


6
2017-09-23 08:28


origen


Respuestas:


El comportamiento que usted describe es esperado.

DDE está vinculado al hilo individual. Esto se debe a que DDE (que generalmente se considera una tecnología heredada) funciona internamente al pasar mensajes de Windows y controladores de ventanas (HWND) tienen afinidad de hilos.

  • Debes llamar DdeInitializeW del mismo hilo que llamas DdeConnect.
  • Ese hilo debe bombear mensajes (por lo que no puede ser un hilo de grupo de subprocesos).
  • También recibirás devoluciones / respuestas en ese mismo hilo.

En otras palabras, necesita hacer su DDE desde un hilo que llama Application.Run, o que frecuentemente llama Application.DoEvents en los momentos en que sea apropiado enviar o recibir los eventos.

Puede usar DDE desde más de un hilo, pero cada uno debe llamar DdeInitializeW y las respuestas siempre se recibirán en el hilo desde el que se envió la solicitud.


6
2017-09-23 08:47