VB 5/6-Tipp 0404: DDE-Demo, Server und Client
von Markus Zeichner
Beschreibung
Ein schönes Beispiel welches anhand einer Server-Client-Komunikation den Umgang mit DDE erläutert und dabei auf Tücken und Kniffe hinweist. Vor dem Testen sollten sie beide Programme getrennt ausführen.
Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektgruppe Group1.vbg ------------- '-------------- Anfang Projektdatei Client.vbp -------------- '---- Anfang Formular "ClientForm" alias ClientForm.frm ---- ' Steuerelement: Schaltfläche "Command7" ' Steuerelement: Schaltfläche "Command6" ' Steuerelement: Schaltfläche "Command5" ' Steuerelement: Schaltfläche "Command4" ' Steuerelement: Schaltfläche "Command3" ' Steuerelement: Schaltfläche "Command2" ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Textfeld "Text1" ' Steuerelement: Beschriftungsfeld "Label1" ' Source von Markus Zeichner ' ' DDE-Client: ' Der Client wird über folgender Controls(Label/Text/Picture) an den Server ' gebunden: ' - ListItem (Name des Server-Steuerelementes von dem die Daten kommen ' sollen, muss 100% übereinstimmen !!!) ' - LinkTopic (hier steht der Servername (Programmname ohne Extension !!!) ' und das DDE-Thema getrent mit | . Also wenn der Serverprogramm ' Server.exe heist und das Thema Talk heisst steht hier Server|Talk ) ' - LinkTimeout (Zeit im ms in der der Server eine Antwort dem Client ' senden muss) ' ' Die Verbindung findet durch das zuweisen der LinkMode eigenschaft des ' Client-Controls statt. Die LinkMode-Eigenschaft kann 0-keine, ' 1-automatisch, 2-manuell, 3-benachrichtigung enthalten. ' Bei 0 findet keine DDE-Verbindung statt, bei 1 wird eine Automatische ' DDE-Verbindung aufgebaut (heisst die Serverdaten werden automatisch an ' den Client gesendet), bei 2 muss der Client mithilfe von ' control.LinkRequest die Daten vom Server abhollen !!! ' ' Vor dem zuweisen der LinkTopic-Eigenschaft des Clientcontrols MUSS !!! ' der Server bereits gestartet sein !!!!! ' ' Auf der Clientseite sind folgende Events verfügbar: ' - LinkOpen (wenn eine Verbindung geöffnet wird) ' - LinkClose (wenn eine Verbindung geschlossen wurde) ' - LinkError (wenn ein Verbindungsfehler aufgetreten ist) ' ' Ein Makro kann der Client mit controlname.LinkExecute "makro..." an den ' Server senden. Option Explicit Public Ende As Boolean Private Sub Command1_Click() ' Makro ServerInfo If Label1.LinkMode = 0 Then ' Prüffen ob Verbindung besteht ' Wenn nicht fehlermeldung MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr zum " & _ "Server ! Makro fehlgeschlagen", vbCritical, "Problemm !" Exit Sub ' und raus End If Label1.LinkExecute "ServerInfo" ' sonst Makro senden ' Command1.SetFocus End Sub Private Sub Command2_Click() ' Makro Problemm If Label1.LinkMode = 0 Then MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr zum " & _ "Server ! Makro fehlgeschlagen", vbCritical, "Problemm !" Exit Sub End If Label1.LinkExecute "Problem" ' Command2.SetFocus End Sub Private Sub Command3_Click() ' Makro DelText If Label1.LinkMode = 0 Then MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr zum " & _ "Server ! Makro fehlgeschlagen", vbCritical, "Problemm !" Exit Sub End If Label1.LinkExecute "DelText" ' Command3.SetFocus End Sub Private Sub Command4_Click() ' Makro SetText If Label1.LinkMode = 0 Then MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr zum " & _ "Server ! Makro fehlgeschlagen", vbCritical, "Problemm !" Exit Sub End If Label1.LinkExecute "SetText" ' Command4.SetFocus End Sub Private Sub Command5_Click() ' Marko HideServer If Label1.LinkMode = 0 Then MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr zum " & _ "Server ! Makro fehlgeschlagen", vbCritical, "Problemm !" Exit Sub End If Label1.LinkExecute "HideServer" ' Command5.SetFocus End Sub Private Sub Command6_Click() ' Makro ShowServer If Label1.LinkMode = 0 Then MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr zum " & _ "Server ! Makro fehlgeschlagen", vbCritical, "Problemm !" Exit Sub End If Label1.LinkExecute "ShowServer" ' Command6.SetFocus End Sub Private Sub Command7_Click() ' Server Starten / Makro EndServer Dim i If Command7.Tag = 0 Then ' Tageigenschaft prüffen On Error Resume Next Text1.LinkMode = 1 ' Verbindung herstellen Label1.LinkMode = 1 ' Verbindung herstellen If Err <> 0 Then ' Fals Fehler (Server nicht gestartet) i = Shell("Server.exe", vbNormalFocus) ' Server starten Text1.LinkMode = 1 ' Verbindung herstellen Label1.LinkMode = 1 ' Verbindung herstellen End If Command7.Caption = "Makro: EndServer" Command7.Tag = 1 Else If Label1.LinkMode = 0 Then MsgBox "Es existiert keine Verbindung" & vbNewLine & "mehr " & _ "zum Server ! Makro fehlgeschlagen", vbCritical, _ "Problemm !" Exit Sub End If Label1.LinkExecute "EndServer" Command7.Tag = 0 Command7.Caption = "Start Server" ' Command7.SetFocus End If End Sub Private Sub Form_Load() Dim i On Error Resume Next Text1.LinkMode = 1 ' Verbindung herstellen Label1.LinkMode = 1 ' Verbindung herstellen If Err <> 0 Then ' Fals Fehler (Server nicht gestartet) i = Shell("Server.exe", vbNormalFocus) ' Server starten Text1.LinkMode = 1 ' Verbindung herstellen Label1.LinkMode = 1 ' Verbindung herstellen End If End Sub Private Sub Form_Unload(Cancel As Integer) Ende = True ' Wegen LinkClose Text1.LinkMode = 0 ' Verbindung abbrechen Label1.LinkMode = 0 ' Verbindung abbrechen End Sub Private Sub Label1_LinkClose() ' Verbindung geschlossen If Ende = False Then ' Fals nicht Programmende MsgBox "Server nicht mehr verfügbar !", vbInformation, "Information" Command7.Tag = 0 Command7.Caption = "Start Server" End If End Sub Private Sub Label1_LinkError(LinkErr As Integer) ' Verbindungsfehler MsgBox "LinkError" End Sub Private Sub Label1_LinkOpen(Cancel As Integer) ' Verbindung gestartet MsgBox "LinkOpen" End Sub '----- Ende Formular "ClientForm" alias ClientForm.frm ----- '--------------- Ende Projektdatei Client.vbp --------------- '-------------- Anfang Projektdatei Server.vbp -------------- '---- Anfang Formular "ServerForm" alias ServerForm.frm ---- ' Steuerelement: Textfeld "ServerText" ' Steuerelement: Timersteuerelement "Timer1" ' Steuerelement: Beschriftungsfeld "ZeitLabel" ' Source von Markus Zeichner ' ' DDE -Server: ' Hier sind folgende Fenstereigenschaften interesant: ' - LinkMode (muß für den Server auf 1-Quelle stehen) ' - LinkTopic (DDE-Thema) ' ' Auf dem Serverformular können mehrere Steuerelemente ' (Textbox/Label/PictureBox) vorhanden sein auf dessen Inhalt der Client ' zugreifen kann. ' Auf der Serverseite werden auserdem folgender Events ausgelöst: ' - Form_LinkOpen (wird nach dem Öffnen der DDE-Verbindung aktiviert.Dieser ' Event kann auch mehrmals auftreten) ' - Form_LinkExecute (wird ausgelöst wenn der Client ein Makrobefehl an den ' Server sendet) ' - Form_LinkClose (wird nach dem schliessen der DDE-Verbindung ausgelöst) ' - Form_LinkError (tritt auf wenn ein Fehler im Zusammenhang mit der ' DDE-Verbindung auftritt) Option Explicit Private Sub Form_LinkClose() ' eine Verbindung wurde geschlossen ServerText.Text = "Eine DDE-Verbindung beendet" & vbNewLine & _ ServerText.Text End Sub Private Sub Form_LinkError(LinkErr As Integer) ' Verbindungsfehler ServerText.Text = "DDE-Error" & vbNewLine & ServerText.Text End Sub ' Makro empfangen Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) Select Case CmdStr ' Makrotext auswährten Case "ServerInfo" InfoBox.Show ' Fenster öffnen aber nicht Modal sonst Problemme Case "Problem" Cancel = True MsgBox "Eine MsgBox oder eine Modale Form" & vbNewLine & _ "bereiten Problemme wenn sie nicht in der LinkTimeout-Zeit" & _ vbNewLine & "geschlossen werden !!!" & vbNewLine & "Warten " & _ "Sie bitte ein Moment...", vbCritical, "Server-Problemm" Case "DelText" ServerText.Text = "" Case "SetText" ServerText.Text = "Nicht alles gleich ausprobieren!" Case "HideServer" ServerForm.Hide Case "ShowServer" ServerForm.Show Case "EndServer" Cancel = True Unload Me End Select Cancel = False ' Makroempfang dem Client 'senden' End Sub Private Sub Form_LinkOpen(Cancel As Integer) ' Verbindung wirde geöffnet ServerText.Text = "Neue DDE-Verbindung" & vbNewLine & ServerText.Text End Sub Private Sub Form_Load() Call Timer1_Timer End Sub Private Sub Form_Unload(Cancel As Integer) Timer1.Enabled = False End End Sub Private Sub Timer1_Timer() ' nur zur Demonstration ZeitLabel.Caption = Now End Sub '----- Ende Formular "ServerForm" alias ServerForm.frm ----- '------- Anfang Formular "InfoBox" alias InfoBox.frm ------- ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Beschriftungsfeld "Label4" ' Steuerelement: Beschriftungsfeld "Label3" ' Steuerelement: Beschriftungsfeld "Label2" ' Steuerelement: Beschriftungsfeld "Label1" Option Explicit Private Declare Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal _ lpOperation As String, ByVal lpFile As String, ByVal _ lpParameters As String, ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Private Sub Command1_Click() Unload Me End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Label4.ForeColor = &H800000 End Sub Private Sub Label4_Click() Dim Result& Result = ShellExecute(Me.hwnd, "Open", "http://www.activevb.de/", "", App.Path, 1) End Sub Private Sub Label4_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Label4.ForeColor = &HFF& End Sub '-------- Ende Formular "InfoBox" alias InfoBox.frm -------- '--------------- Ende Projektdatei Server.vbp --------------- '-------------- Ende Projektgruppe Group1.vbg --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Michael seifert am 09.04.2002 um 08:06
Ich muß mittles DDE Daten aus VB von einem DDE Server holen. In VB nutze ich ein Label für die Kommunikation. Ich habe aber das Problem. das lblLabel.Caption nur 28.000 Zeichen empfängt. Der vom Server bereitgestellte String ist aber ca. 180.000 Zeichen lang. Gibt es eine Lösung?
Kommentar von Stefan Arnold am 04.03.2002 um 09:05
Eine "Kleinigkeit" scheint mir hier nicht behandelt zu sein:
Wie bekomme ich von meiner Server-Anwendung nach einem LinkExecute des Clients Daten an den Client zurück ??
O.K., auf der Client-Seite ist das einfach: "LinkRequest".
Aber wenn ich die Server-Anwendung selber in VB basteln muß (steinalte Warenwirtschaft), dann muß ich irgendwie diese Daten bereitstellen und auf die - ggf. mehrfachen - LinkRequests reagieren können.
Wie geht das ??
Vielen Dank für Tips, Hin- oder Verweise aller Art
Stefan
P.S. Ja, ich brauche die Info
für gewerbliche Zwecke, aber
im Moment weiß ich mir keinen anderen
Rat, weil ich keine Doku mehr über DDE
finde.
Kommentar von Detlef Kuhl am 29.09.2001 um 18:53
Hi, ich suche schon seit langen ein Beispiel wie man über DDE ein Windows-Prog. mit ein VB-Prog. komunizieren kann und war erfreut solch ein Beispiel zu finden.
Ich habs gleich ausprobiert aber meher als das Fenster mit der Text-box und der Zeitangebe läuft nicht, wie bekommen ich den Verbindung du der MSG-Box ? Oder habe ich da etwas falsch verstanden ?