Rubrik: Windows/System | 22.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, WinME | Views: 5.386 |
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:
wType | Erwartet eine der "wType"-Konstanten, die das Ereignis beschreiben welchesmomentan in der DDE passiert. |
wFmt | Beschreibt das Format, in dem die Daten zu senden oder zu empfangen sind. |
h_Conv | Enthält das Handle einer DDE-Verbindung, der die aktuelle Transaktion beschreibt. |
h_Topic | Enthält das Handle zu einem DDE-String, den der DDE-Client bei "hszTopic" übergeben hat. |
h_Service | Enthält das Handle zu einem DDE-String, den der DDE-Client bei "hszService" übergeben hat. |
hData | Enthält ein Handle zu einem DDE-Daten. |
lData1 | Enthält transaktionsspezifische Daten. |
lData2 | Enthä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