vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Windows/System22.03.05
DdeCallback-Funktion

Diese Funktion wird aufgerufen, wenn eine Anwendung einen DDE-Server eingerichtet hat und gewählte DDE-Ereignisse eintreffen.

Betriebssystem:  Win95, Win98, WinNT 3.1, Win2000, WinMEViews:  5.384 

Deklaration:

Function DDECallback(ByVal wType As Long, ByVal wFmt As Long, ByVal h_Conv  _
  As Long, ByVal h_Topic As Long, ByVal h_Service As Long, ByVal hData As _
  Long, ByVal lData1 As Long, ByVal lData2 As Long) As Long
 
End Function

Beschreibung:
Diese Funktion wird aufgerufen, wenn eine Anwendung einen DDE-Server eingerichtet hat und gewählte DDE-Ereignisse eintreffen.

Parameter:
wTypeErwartet eine der "wType"-Konstanten, die das Ereignis beschreiben welchesmomentan in der DDE passiert.
wFmtBeschreibt das Format, in dem die Daten zu senden oder zu empfangen sind.
h_ConvEnthält das Handle einer DDE-Verbindung, der die aktuelle Transaktion beschreibt.
h_TopicEnthält das Handle zu einem DDE-String, den der DDE-Client bei "hszTopic" übergeben hat.
h_ServiceEnthält das Handle zu einem DDE-String, den der DDE-Client bei "hszService" übergeben hat.
hDataEnthält ein Handle zu einem DDE-Daten.
lData1Enthält transaktionsspezifische Daten.
lData2Enthält transaktionsspezifische Daten.

wType Konstanten:

Const XTYPF_NOBLOCK = &H2
' Standard-Konstante (CBR_BLOCK funktioniert nicht)
 
Const XCLASS_NOTIFICATION = &H8000
' Die Rückgabe wird ignoriert; dient nur zur Benachrichtigung
 
Const XCLASS_FLAGS = &H4000
' Die Funktion muss DDE_FACK, DDE_FBUSY, oder DDE_FNOTPROCESSED zurückgeben
 
Const XCLASS_DATA = &H2000
' Die Funktion muss ein Handle zu Daten, CBR_BLOCK oder 0 zurückgeben
 
Const XCLASS_BOOL = &H1000
' 0 (False) oder 1 (True) muss zurückgegeben werden
 
Const XTYP_ADVSTART = (&H30 Or XCLASS_BOOL)
' Noch keine Informationen
 
Const XTYP_CONNECT = (&H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_ADVREQ = (&H20 Or XCLASS_DATA Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_REQUEST = (&HB0 Or XCLASS_DATA)
' Noch keine Informationen
 
Const XTYP_WILDCONNECT = (&HE0 Or XCLASS_DATA Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_ADVDATA = (&H10 Or XCLASS_FLAGS)
' Noch keine Informationen
 
Const XTYP_EXECUTE = (&H50 Or XCLASS_FLAGS)
' Noch keine Informationen
 
Const XTYP_POKE = (&H90 Or XCLASS_FLAGS)
' Noch keine Informationen
 
Const XTYP_CONNECT_CONFIRM = (&H70 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_DISCONNECT = (&HC0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_ERROR = (&H0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_MONITOR = (&HF0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_REGISTER = (&HA0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
' Noch keine Informationen
 
Const XTYP_XACT_COMPLETE = (&H80 Or XCLASS_NOTIFICATION)
' Noch keine Informationen
 
Const XTYP_UNREGISTER = (&HD0 Or XCLASS_NOTIFICATION Or XTYPF_NOBLOCK)
' Noch keine Informationen

Rückgabewert:
Je nach "wType"-Konstante muss hier ein bestimmter Wert oder eine Konstante zurückgegeben werden.

Rückgabekonstanten:

Const DDE_FACK = &H8000
' Die Transaktion wurde angenommen (nur möglich, wenn die eintreffende  
' Nachricht XCLASS_FLAGS enthält)
 
Const DDE_FBUSY = &H4000
' Die Transaktion wurde nicht angenommen, weil eine andere noch ausgeführt  
' wird (nur möglich wenn die eintreffende Nachricht XCLASS_FLAGS enthält)
 
Const DDE_FNOTPROCESSED = &H0
' Die Transaktion wurde nicht ausgeführt (nur möglich wenn die eintreffende  
' Nachricht XCLASS_FLAGS enthält)
 
Const CBR_BLOCK = &HFFFF
' Die Transaktion wird geblockt (nur möglich wenn die eintreffende Nachricht 
' nicht XTYPF_NOBLOCK enthält, aber die Konstante XCLASS_DATA enthalten ist)

Beispiel:

' Schreiben Sie diesen Code in ein öffentliches Modul
Private Declare Function DdeQueryString Lib "user32" _
  Alias "DdeQueryStringA" ( _
  ByVal idInst As Long, _
  ByVal hsz As Long, _
  ByVal psz As String, _
  ByVal cchMax As Long, _
  ByVal iCodePage As Long) As Long
 
' DdeQueryString iCodePage-Konstanten
Private Const CP_WINANSI = 1004 ' (Standard) ANSI Zeichensatz
Private Const CP_WINUNICODE = 1200 ' Unicode Zeichensatz
 
' Callback uType-Konstanten
Private Const XTYP_CONNECT = (&H60 Or XCLASS_BOOL Or XTYPF_NOBLOCK) 
' Ein Client will sich verbinden
 
Public hInst As Long, hService As Long, hTopic As Long, hConv As Long
Public Function DDECallback(ByVal wType As Long, ByVal wFmt As Long, ByVal _
  h_Conv As Long, ByVal h_Topic As Long, ByVal h_Service As Long, ByVal hData  _
  As Long, ByVal lData1 As Long, ByVal lData2 As Long) As Long
 
  Dim hInstCount As Long, TmpBuffer As String, BuffeLength As Long,  _
    Retval As Long, hWnd2ndInstance As Long
 
  Select Case wType
  Case XTYP_CONNECT ' Eine Anwendung unseres Typs verbindet sich mit der DDE 
 
    ' Ermitteln des Servicenamens des anfragenden Clients
    BuffeLength = DdeQueryString(hInst, h_Service, TmpBuffer, 0&, CP_WINANSI) 
    TmpBuffer = Space(BuffeLength + 1)
    Retval = DdeQueryString(hInst, h_Service, TmpBuffer,  _
    Len(TmpBuffer), CP_WINANSI)
    TmpBuffer = Left$(TmpBuffer, BuffeLength)
 
    ' Falls es ein Client unseres Typs ist dann unser wieder Fenster anzeigen 
    If TmpBuffer = "VB Api Helpline" Then
        MsgBox "Es wurde der Start einer weiteren Instanz  _
        ermittelt.", , "Instanz ID: " & hInst
        Form1.Show
        DDECallback = 1 ' Anfrage bestätigen, dass ein DDE Server vorhanden ist
    End If
  End Select
End Function
' Schreiben Sie den nachfolgenden Code in eine Form
Private Declare Function DdeInitialize Lib "user32" _
  Alias "DdeInitializeA"  ( _
  pidInst As Long, _
  ByVal pfnCallback As Long, _
  ByVal afCmd As Long, _
  ByVal ulRes As Long) As Integer
Private Declare Function DdeUninitialize Lib "user32" ( _
  ByVal idInst As Long) As Long
Private Declare Function DdeNameService Lib "user32" ( _
  ByVal idInst As Long, _
   ByVal hsz1 As Long, _
  ByVal hsz2 As Long, _
  ByVal afCmd As Long) As Long
Private Declare Function DdeCreateStringHandle Lib "user32" _
  Alias "DdeCreateStringHandleA" ( _
  ByVal idInst As Long, _
  ByVal psz As String, _
  ByVal iCodePage As Long) As Long
Private Declare Function DdeConnect Lib "user32" ( _
  ByVal idInst As Long, _
   ByVal hszService As Long, _
  ByVal hszTopic As Long, _
  pCC As Any) As Long
Private Declare Function DdeFreeStringHandle Lib "user32" ( _
  ByVal idInst As Long, _
  ByVal hsz As Long) As Long
 
' DdeCreateStringHandle iCodePage-Konstanten
Private Const CP_WINANSI = 1004 ' (Standard) ANSI Zeichensatz
Private Const CP_WINUNICODE = 1200 ' Unicode Zeichensatz
 
' DdeNameService afCmd-Konstanten
Private Const DNS_REGISTER = &H1 ' Registriert einen Fehlercode
Private Const DNS_UNREGISTER = &H2 ' Deregistriert einen DDE Server
 
' DdeInitialize afCmd-Konstanten
Private Const APPCLASS_STANDARD = &H0& ' Richtet das Programm als Standard_DDE Anwendung ein
' DDE Server starten
Private Sub Form_Load()
  Dim Retval As Long
 
  ' DDE initialisieren, nur die CBF_CONNECTIONS soll empfangen werden
  Retval = DdeInitialize(hInst, AddressOf DDECallback,  _
  APPCLASS_STANDARD, 0&)
  If Retval << 0 Then
    Exit Sub
  End If
 
  ' 2 eindeutige Strings erstellen, die unsere Anwendung beschreiben
  hService = DdeCreateStringHandle(hInst, "VB Api Helpline", CP_WINANSI)
  hTopic = DdeCreateStringHandle(hInst, "www.vbapihelpline.de", CP_WINANSI) 
 
  ' Verbinden mit der DDE, und auf Vorhandensein eines Servers testen
  hConv = DdeConnect(hInst, hService, hTopic, ByVal 0&)
  If hConv << 0 Then
    MsgBox "Es besteht bereits eine Instanz, Programm wird beendet",  _
    , "Instanz ID: " & hInst
    Unload Me
  Else
    ' Server starten falls noch keiner existiert
    Retval = DdeNameService(hInst, hService, 0&, DNS_REGISTER)
  End If
End Sub
' DDE-Sitzung beenden
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  ' Beenden des Nachrichtenempfangs
  Call DdeNameService(hInst, hService, 0&, DNS_UNREGISTER)
 
  ' Strings auflösen
  Call DdeFreeStringHandle(hInst, hService)
  Call DdeFreeStringHandle(hInst, hTopic)
 
  ' Beenden der DDE-Sitzung
  Call DdeUninitialize(hInst)
End Sub
' Fenster zum Testen der 2ten Instanz verstecken lassen
Private Sub Command1_Click()
  Me.Hide
End Sub

 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.