Virtual Developer Workshop: Containerized Development with Docker
When writing a application that uses command lines, you are left with a small dilemma of 'What if the User reruns the app with a new command-line?' By using a DDE link, you can pass the new commands through to the Previous instance of the application.
OR... You have written an application that runs as a service, and want to use a separate application to configure the services options. Again, you could use a DDE to transfer the info and data to the application.
So, for this task, you are looking at making an application that will pass the new command line to the previous instance.
First, you need to make some changes on your form so that it will accept the DDE link. In the project explorer, select the form that will accept the connection. Change the Linkmode property to 1 - Source. Although you set it as the source, the form really is now the target for DDE links. You also set the LinkTopic to some relevant name rather than using the default Form1 topic. In the example, you will use "DDELink".
Now that the Application is ready to accept DDE links, you now can set up the Link Action. You will now notice that the form has a new event, Form_LinkExecute. Whenever a successful DDE link takes place, this event is triggered, giving you the data that the DDE link requester has sent.
Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) Me.SetFocus List1.AddItem CmdStr Cancel = 0 End Sub
In the above code, I simply add the Link data to a listbox, but you can store or set off all sorts of data or triggers from this Event.
There are two things to take care of and to remember:
- The app is running and may even be in the middle of processing. (This event can be called during a Doevents from another sub in the application.) Take care not to alter any variables that are critical to these subs. Rather, set a flag to inform the application that new data is available. Store the data in temporary variables and update when the process is completed.
- Many of your classes and controls will be loaded and initialised already. Check to see if they are. Reloading and re-initialising them may cause unpredictable results.
Now, how do you initiate the DDE link and send data through it? I found that, for ease of use and minimal interference with the rest of the application, it's best to add a Textbox to the form, set its Visible property to False, and initialize the connection from it.
So, now you add a Textbox to the form, calling it HiddenText. Change the Visible property to False. No other properties need to be set. You now are ready to set up the DDE link.
Because in this task you looking at linking to a previous instance, your DDE link will be initiated from the 'orm's Form_Load event. In this event, the first thing you do is check to see whether there is a previous instance.
Private Sub Form_Load() If App.PrevInstance Then 'Previous instance of App found If Command$ <> vbNullString Then 'New commandLine parameters to send HiddenText.Text = Command$ HiddenText.LinkTopic = "Project1|DDELink" 'Set the link topic HiddenText.LinkMode = vbLinkManual 'Initiate the DDE link HiddenText.LinkExecute HiddenText.Text 'Send data HiddenText.LinkMode = vbLinkNone 'Close Link End If Unload Me 'Close the copy of the app Exit Sub End If If Command$ <> vbNullString Then List1.AddItem Command$ End If End Sub
Note: Testing the DDE link will not work in the IDE. You need to compile the application and run the executable.
Passing data to a second application is the principle. The Form_LinkExecute code is in the application that needs to receive the data. Instead of using Form_load, you use a command button in the sending application.
Private Sub Command1_Click() Text1.LinkTopic = "DDE_Main|DDElink" 'App name and Link topic of destination program. Text1.LinkMode = vbLinkManual Text1.LinkExecute Text1.Text Text1.LinkMode = vbLinkNone Text1.Text = "" End Sub
That's about all there is to know about DDE links. Enjoy.