Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Win Api DDE connection multithread

I have function implementation of DDE client using Win Api in C#. Everything works fine in case that I call DdeInitializeW and DdeConnect in single thread. Specifically, these are wrapper definitions:

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

If I called DdeInitializeW and DdeConnect in different threads, DdeConnect return null pointer.

Also, if I called both of them (established DDE connection) in one thread, I can't use this DDE channel in another thread (i'm getting INVALIDPARAMETER DDE error).

As I said, everything works without problems in single thread.

like image 714
Majak Avatar asked Sep 23 '15 08:09

Majak


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

What is C in C language?

What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.


1 Answers

The behaviour you describe is expected.

DDE is tied to the individual thread. This is because DDE (which is generally considered a legacy technology) works internally by passing windows messages, and windows handles (HWND) have thread affinity.

  • You must call DdeInitializeW from the same thread you call DdeConnect.
  • That thread must pump messages (so it cannot be a thread-pool thread).
  • You will get callbacks/replies on that same thread also.

In other words you need to do your DDE from a thread which calls Application.Run, or which frequently calls Application.DoEvents at moments when it is appropriate for the events to be sent or received.

You can use DDE from more than one thread, but each must call DdeInitializeW and replies will always be received on the thread the request was sent from.

like image 66
Ben Avatar answered Sep 18 '22 13:09

Ben