Forum: PC-Programmierung VB, DLL soll Ereignis in meinem Programm auslösen. Wie ?


von Michael D. (Gast)


Lesenswert?

Hallo Forum,
Ich habe eine bereitgestellte DLL . Eine seine Funktion kann Ereignis
auslösen.
Aber ich weis nicht, wie das in VB deklariert und verwendet wird .
Ich habe bis jetzt wenig mit DLLs gearbeitet und nur Funktionen in DLLs
aufgerufen.
Aus der Beschreibung habe ich nur verstanden dass über PVOID pvArg ein
Pointer übergeben soll der auf meine ereignisverarbeitende Funktion
zeigt.
Ein paar Zeilen mit Implementierung dieser Funktion in VB würden mir
sehr helfen.
Hier ist Beschreibung der Funktion und Beispiel (wahrscheinlich in C)

FT_SetEventNotification

Sets conditions for event notification.

FT_STATUS FT_SetEventNotification ( FT_HANDLE ftHandle, DWORD
dwEventMask, PVOID pvArg )

Parameters:
ftHandle
Handle of the device.

dwEventMask
Conditions that cause the event to be set.

pvArg
Interpreted as a handle of an event
Return Value

FT_OK if successful, otherwise the return value is an FT error code.

Remarks
An application can use this function to setup conditions which allow a
thread to block until one of the conditions is met. Typically, an
application will create an event, call this function, then block on the
event. When the conditions are met, the event is set, and the
application thread unblocked.
dwEventMask is a bit-map that describes the events the application is
interested in. pvArg is interpreted as the handle of an event which has
been created by the application. If one of the event conditions is met,
the event is set.
If FT_EVENT_RXCHAR is set in dwEventMask, the event will be set when a
character has been received by the device. If FT_EVENT_MODEM_STATUS is
set in dwEventMask, the event will be set when a change in the modem
signals has been detected by the device.

This example shows how to wait for a character to be received or a
change in modem status.

First, create the event and call FT_SetEventNotification.

FT_HANDLE ftHandle; // handle of an open device
FT_STATUS ftStatus;

HANDLE hEvent;
DWORD EventMask;

hEvent = CreateEvent(
NULL,
false, // auto-reset event
false, // non-signalled state
“”
);

EventMask = FT_EVENT_RXCHAR | FT_EVENT_MODEM_STATUS;

ftStatus = FT_SetEventNotification(ftHandle,EventMask,hEvent);

Sometime later, block the application thread by waiting on the event,
then when the event has occurred, determine the condition that caused
the event, and process it accordingly.

WaitForSingleObject(hEvent,INFINITE);
DWORD EventDWord;
DWORD RxBytes;
DWORD TxBytes;
FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);

if (EventDWord & FT_EVENT_MODEM_STATUS) {
// modem status event detected, so get current modem status
FT_GetModemStatus(ftHandle,&Status);
if (Status & 0x00000010) {
// CTS is high
}
else {
// CTS is low
}
if (Status & 0x00000020) {
// DSR is high
}
else {
// DSR is low
}
}
if (RxBytes > 0) {
// call FT_Read() to get received data from device
}

Ich hoffe sehr das ich hier eine Antwort auf meine Frage bekomme. Denn
im Google und VB-Hilfe habe ich nichts gefunden, was ich verstehen
könnte.
Grüß
Michael D.

von Rufus T. Firefly (Gast)


Lesenswert?

.

   "Aus der Beschreibung habe ich nur verstanden dass über
   PVOID pvArg ein Pointer übergeben soll der auf meine
   ereignisverarbeitende Funktion zeigt."

Ich tippe auf ein Missverständnis.

   "pvArg
      Interpreted as a handle of an event"

Ein (event-) Handle ist ein opaker 32-Bit-Wert.
Das ist keine Funktion, die aufgerufen wird, sondern ein Objekt, das
die Win32-API zur Verfügung stellt. Erzeugt wird ein solches
Eventhandle mit der Funktion CreateEvent, ausgelöst wird es mit
SetEvent, und auf das Event kann man mit WaitForSingleObject bzw.
WaitForMultipleObjects warten.


Nichts anderes beschreibt der von Dir gepostete Beispielcode.

Mit CreateEvent wird das Eventhandle erzeugt,
mit FT_SetEventNotification wird der FTDI-Treiber angewiesen, dieses
Event zu signalisieren, wenn was auf der Schnittstelle geschieht, und
mit WaitForSingleObject wird auf das Event gewartet.

Damit ist das Programm solange blockiert, bis das Event vom
FTDI-Treiber gesetzt wird. In einem normalen VB-Programm würde die
Oberfläche "einfrieren" und das Programm nicht mehr auf
Benutzerinteraktion reagieren - daher gehören derlei Funktionen in
einen separaten Thread, nicht in den Hauptthread des Programmes, der
für Benutzerinteraktion zuständig ist.

von Tom (Gast)


Lesenswert?

@Rufus: Kurz mal OT:
Kann VB (.NET lassen wir mal weg) überhaupt mit mehreren hreads umgehen
oder müsste ich (angenommen ich hab mal so ein Problem) auf die Win32
API zurückgreifen ?

von Rufus T. Firefly (Gast)


Lesenswert?

Ich verwende kein VB, kann daher keine definitiven Aussagen über die
Möglichkeit treffen, damit mehrere Threads zu programmieren.

Ich verstehe aber den Rest Deiner Frage nicht; was bedeutet für Dich
"auf die Win32 API zurückgreifen" in diesem Kontext?

Was genau hast Du überhaupt vor, bzw. ist Dir der Unterschied bekannt
zwischen einem Event und dem, was VB ein "Ereignis" nennt?

Letzteres ist eine Eigenschaft der COM-Automationsschnittstelle (trotz
des glücklich gewählten Namens hat das garnichts mit seriellen
Schnittstellen zu tun), und wird von manchen Automationsobjekten wie
beispielsweise dem Office-Paket angeboten.

Hast Du Dir mal die VB-Beispiele von FTDI auf
http://www.ftdichip.com/Projects/CodeExamples/VB.htm
angesehen?

von Tom (Gast)


Lesenswert?

nunja .. ich hatte beruflich mit Anwendungen zu tun, welche auf mehreren
Threads basierten, sowohl unter C++ als auch unter C# (wobei mir die C#
Variante deutlich mehr zusagte).

Wenn ich sage ob ich bzgl. Threads auf die Winapi zugreifen muss, meine
ich damit nur, ob ich au CreateThread und Konsorten zurückgreifen kann.
Das hat mit Ereignissen mal noch gar nichts zu tun :)

von Rufus T. Firefly (Gast)


Lesenswert?

Tja, mit dieser Frage wirst Du Dich an "VB-Profis" wenden müssen. Was
passiert, wenn CreateThread aus VB heraus aufgerufen wird, möchte ich
mir nicht genauer vorstellen. Immerhin muss ein Funktionspointer
übergeben werden - gibt's sowas überhaupt in VB?

Wenn Du schon Erfahrungen oder sowas ähnliches mit C++ oder -yuck!- C#
hast, dann ist's vielleicht angesagter, VB einfach zu vergessen ...

von Tom (Gast)


Lesenswert?

VB kann mir eh gestohlen bleiben ... mich hätts nur grad interessiert
wenn du es zufällig gewusst hättest.

btw: für Pointer und ähnliches gibt es die Entsprechung ByVal/ByRef ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.