DDE with VB.Net
Introduction
DDE appears 
to be the first solution Microsoft offered to let two applications communicate. 
It's an awkward and slow solution, which explains why it's not supported by 
default in VB.Net. Apparently, the only open-source add-on is NDde, last updated 
in 2006.
To read
http://www.angelfire.com/biz/rhaminisys/ddeinfo.html#DDEoverview
http://msdn.microsoft.com/en-us/library/ms648774(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms649053.aspx
Setup
Download and unzip NDde
Launch VB 2008 Express, and create a new Windows Form project
Project > Add Reference > Browse, and choose NDde.dll
Coding
DDE 
mechanism overview
DDE server = service + topic + item
service + topic = channel or phone number
To establish a conversation a DDE client specifies the service/topic name 
pair (channel) it wishes to connect to. Windows broadcasts the request to all 
top level windows. The first server to accept is connected to the client and 
so a conversation is established.
Sample
    -   Try
    -       Using client As DdeClient 
    = New DdeClient("myapp", "mytopic")
    -           AddHandler 
    client.Disconnected, AddressOf OnDisconnected
    -  
    -           client.Connect()
    -  
    -           client.Execute("mycommand", 
    60000)
    -  
    -           client.Poke("myitem", 
    DateTime.Now.ToString(), 60000)
    -           Console.WriteLine("Request: 
    " + client.Request("myitem", 60000))
    -  
    -           client.BeginExecute("mycommand", 
    AddressOf OnExecuteComplete, client)
    -  
    -           client.BeginPoke("myitem", 
    Encoding.ASCII.GetBytes(DateTime.Now.ToString() + Convert.ToChar(0)), 1, 
    AddressOf OnPokeComplete, client)
    -  
    -           client.BeginRequest("myitem", 
    1, AddressOf OnRequestComplete, client)
    -  
    -           client.StartAdvise("myitem", 
    1, True, 60000)
    -           AddHandler 
    client.Advise, AddressOf OnAdvise
    -  
    -           Console.WriteLine("Press 
    ENTER to quit...")
    -           Console.ReadLine()
    -  
    -       End Using
    -  
    -   Catch e As Exception
    -  
    -       Console.WriteLine(e.ToString())
    -       Console.WriteLine("Press 
    ENTER to quit...")
    -       Console.ReadLine()
    -  
    -   End Try
    -  
    - End Sub
    -  
    - Private Sub OnExecuteComplete(ByVal ar As IAsyncResult)
    -   Try
    -       Dim client As DdeClient 
    = DirectCast(ar.AsyncState, DdeClient)
    -       client.EndExecute(ar)
    -       Console.WriteLine("OnExecuteComplete")
    -   Catch e As Exception
    -       Console.WriteLine("OnExecuteComplete: 
    " + e.Message)
    -   End Try
    - End Sub
    -  
    - Private Sub OnPokeComplete(ByVal ar As IAsyncResult)
    -   Try
    -       Dim client As DdeClient 
    = DirectCast(ar.AsyncState, DdeClient)
    -       client.EndPoke(ar)
    -       Console.WriteLine("OnPokeComplete")
    -   Catch e As Exception
    -       Console.WriteLine("OnPokeComplete: 
    " + e.Message)
    -   End Try
    - End Sub
    -  
    - Private Sub OnRequestComplete(ByVal ar As IAsyncResult)
    -   Try
    -       Dim client As DdeClient 
    = DirectCast(ar.AsyncState, DdeClient)
    -       Dim data() As Byte 
    = client.EndRequest(ar)
    -       Console.WriteLine("OnRequestComplete: 
    " + Encoding.ASCII.GetString(data))
    -   Catch e As Exception
    -       Console.WriteLine("OnRequestComplete: 
    " + e.Message)
    -   End Try
    - End Sub
    -  
    - Private Sub OnStartAdviseComplete(ByVal ar As IAsyncResult)
    -   Try
    -       Dim client As DdeClient 
    = DirectCast(ar.AsyncState, DdeClient)
    -       client.EndStartAdvise(ar)
    -       Console.WriteLine("OnStartAdviseComplete")
    -   Catch e As Exception
    -       Console.WriteLine("OnStartAdviseComplete: 
    " + e.Message)
    -   End Try
    - End Sub
    -  
    - Private Sub OnStopAdviseComplete(ByVal ar As IAsyncResult)
    -   Try
    -       Dim client As DdeClient 
    = DirectCast(ar.AsyncState, DdeClient)
    -       client.EndStopAdvise(ar)
    -       Console.WriteLine("OnStopAdviseComplete")
    -   Catch e As Exception
    -       Console.WriteLine("OnStopAdviseComplete: 
    " + e.Message)
    -   End Try
    - End Sub
    -  
    - Private Sub OnAdvise(ByVal sender As Object, ByVal args 
    As DdeAdviseEventArgs)
    -   Console.WriteLine("OnAdvise: " 
    + args.Text)
    - End Sub
    -  
    - Private Sub OnDisconnected(ByVal sender As Object, ByVal 
    args As DdeDisconnectedEventArgs)
    -   Console.WriteLine( _
    -    "OnDisconnected: " + _
    -    "IsServerInitiated=" + args.IsServerInitiated.ToString() 
    + " " + _
    -    "IsDisposed=" + args.IsDisposed.ToString())
    - End Sub
Q&A
How to use DDE in VB.Net?
NDde 2.01.0563 source code uploaded 
Jun 7 2007
Mark Hurd's VB.Net 
DDE sample
DDEML
What is DDEML?
"The Dynamic Data Exchange Management Library (DDEML) provides an interface 
that simplifies the task of adding DDE capability to an application. Instead 
of sending, posting, and processing DDE messages directly, an application uses 
the functions provided by the DDEML to manage DDE conversations. [...] To use 
the DDEML, you must include the DDEML.H header file in your source files, link 
with the USER32.LIB file, and ensure that the DDEML.DLL file resides in the 
system's path." (source)
What is ROT (Running Object Table)?
Resources