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.
. "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.
@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 ?
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?
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 :)
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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.