' schrieb:Hallo,
ich versuche nun schon seit einiger zeit mit meinen nicht vorhandenen c++ kenntnissen das ANT (http://www.thisisant.com) unter LabVIEW nutzbar zu machen, aber leider ohne erfolg
kurz zur beschreibung des problems - die dll des herstellers benötigt als parameter einen zeiger auf eine callbackfunktion - jedenfalls habe ich versucht, eine dll zu schreiben, die die dll und benötigten functionen der herstellerdll lädt und mir dann die daten an LabVIEW als userevent schickt (da gibts ein beispiel auf der ni seite: lvuserevent).
LabVIEW gibt mir dann den fehler 1097 beim aufruf der eventfunctionen zurück. habs natürlich gegoogelt und eine menge gefunden, was das sein könnte... aber ich find den fehler nicht.
falls jemand gut in c++ ist oder änliches probleme (callbackfunctionen bei dlls) gelöst hat und mir tipps geben könnte würde ich micht sehr freuen.
das vc++ projekt ist leider zu groß zum posten - kann aber unter http://www.unet.univie.ac.at/~a0302379/a...devent.zip (4,7 MB [diese intellisense db..]) heruntergeladen werden.
vielen, vielen dank im voraus
martin
H e r z l i c h e n G l ü c k w u n s c h !
L V F - T a s s e 2 0 0 8!
Bei dem von Dir geposteten Vorbild blick ich leider nicht durch. Mir scheint Du hast die Idee von Callbacks nach Userevents nicht sinnvoll aus dem heruntergeladenen Vorbild herauskristallisiert.
Du musst per Callback in Deiner DLL eine Registerfunction haben mit der von LabVIEW aus eine User Event Refnum an die DLL geben kannst die dann den zugehorigen Callback installiert und auch irgendwie die Zuweising Refnum<->Callback vornimmt. Wenn Deine Callback Funktion einen user data Parameter hat (meist einen uInt32 dem man zum Beispiel einen Pointer auf eine Struktur mit allen nötigen Informationen um sowohl allfällige extra Daten wie etwa Buffers aber auch die Informationen die nötig sind um den Zusammenhang zwischen der jeweiligen Refnum und der Instanz Deiner Callbackfunktion vermittlen zu können) kannst Du den verwenden.
Das klingt alles komplex und ist lästig zu tun? Ja aber da kommst Du einfach nicht darum herum. Selbst wenn Du von C aus C callbacks verwendest ist dies alles nicht grundsätzlich anders. Bei LabVIEW kommt einfach noch der extra Schritt mit der Umsetzung in ein Event hinzu.
Also was Du brauchst ist eine RegisterEvent Funktion die von Deiner DLL exportiert wird, die den LVUserEvent Refnum als Parameter bekommt. Diese Funktion legt einen Speicher an in dem sowohl alle benötigten Callbackbuffer Platz habe als auch diese LVUserEvent Refnum. Danach wird Deine Callbackfunktion installiert. Wenn die Callbackfunktion einen User Data Parameter hat den Du bei der Installation mitgeben kannst gibst Du dort den Pointer zum zuvor angelegten Speicher mit. Ansonsten musst Du diesen irgendwo in eine globale Variable schreiben und auch für jede neue Instanz Deiner Callbacks eine neue Globale und eine neue Callbackfunktion machen.
Die eigentliche Callbackfunktion holt sich den Datenpointer (entweder aus dem user data Parameter oder aus der entsprechenden Global) macht was immer nötig ist um die von der Callback mitgeteilten Parameter so schnell als möglich zu verarbeiten und sendet dann durch mittel von PostLVUserEvent das entsprechende Event an die LabVIEW Event Struktur, wobei Du die LVUserEvent Refnum verwendest die ebenfalls in dem Datenbuffer abgespeichert ist.
Wenn Du das Ganze echt perfekt machen willst gibst Du von der RegisterEvent Funktion auch noch den Pointer auf den angelegten Speicher als extra Parameter zurück und implementierst noch eine UnregisterEvent Funktion die diesen Pointer als Parameter bekommt, die entsprechenden Funktionen aufruft um die Callback zu deinstallieren und schliesslich auch noch den angelegten Speicher für den Buffer freigibt.
Rolf Kalbermatter