2015-09-23 2 views
6

Ich habe Funktion Implementierung von DDE-Client mit Win Api in C#. Alles funktioniert gut, wenn ich DdeInitializeW und DdeConnect in einem Thread aufrufen. Insbesondere sind diese wrapper Definitionen:C# Win Api DDE Verbindung Multithread

[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 
     ); 

Wenn I DdeInitializeW und DdeConnect in verschiedenen Threads aufgerufen, DdeConnect return NULL-Zeiger.

Wenn ich beide (etablierte DDE-Verbindung) in einem Thread aufgerufen habe, kann ich diesen DDE-Kanal nicht in einem anderen Thread verwenden (ich bekomme INVALIDPARAMETER DDE-Fehler).

Wie gesagt, im Single Thread läuft alles ohne Probleme.

Antwort

6

Das von Ihnen beschriebene Verhalten wird erwartet.

DDE ist an den einzelnen Thread gebunden. Dies liegt daran, dass DDE (das allgemein als Legacy-Technologie bezeichnet wird) intern durch das Übergeben von Windows-Nachrichten funktioniert und Windows-Handles (HWND) Thread-Affinität haben.

  • Sie müssen DdeInitializeW aus dem gleichen Thread rufen Sie DdeConnect nennen.
  • Dieser Thread muss Nachrichten pumpen (also kann es kein Thread-Pool-Thread sein).
  • Sie erhalten auch Rückrufe/Antworten auf den gleichen Thread.

Mit anderen Worten müssen Sie Ihre DDE von einem Thread zu tun, die Application.Run nennt, oder die Application.DoEvents in Momenten häufig aufruft, wenn es angemessen ist, für die Ereignisse gesendet oder empfangen werden.

Sie können DDE aus mehr als einem Thread verwenden, aber jeder muss DdeInitializeW aufrufen und Antworten werden immer auf dem Thread empfangen, von dem die Anfrage gesendet wurde.

+0

Genau so mache ich es in diesem Moment. OK, ich hatte Angst, dass dies ein Problem von DDE selbst ist. Vielen Dank, dass Sie mich darin unterstützt haben. – Majak

+0

Tipp auch, wenn Sie es noch nicht tun: Behalten Sie mehrere DDE-Konversationen im Auge, indem Sie jeder Konversation eine eindeutige ID geben, indem Sie 'DdeSetUserHandle' und' DdeQueryConvInfo' verwenden. Das vereinfacht alles sehr. https://msdn.microsoft.com/en-us/library/windows/desktop/ms648765(v=vs.85).aspx – Ben