Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0404: DDE-Demo, Server und Client

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

ShellExecuteA (ShellExecute)

Download:

Download des Beispielprojektes [21,7 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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 ?