INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Vector Informatik: CAN Anbindung mit XL Treiber v6.4 (über DLL)



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

21.11.2007, 12:08
Beitrag #11

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Vector Informatik: CAN Anbindung mit XL Treiber v6.4 (über DLL)
' schrieb:Wieso nicht?
Das beziehe ich auf mein "Eigentlich nicht". Warum? Weil das physikalische Kopieren von Speicher auf Anwenderebene - und gerade in LV - nicht gerade der Weisheit letzter Schluss ist. Übergib mal an dieses VI falsche Werte. Was möglich ist. Und was passiert dann - Bluescreen, wenn du Pech/Glück hast. Es ist ja schön, dass es diese Funktion, die du ja auch richtig anwendest, noch gibt. Ich bin halt der Meinung, auf einer Ebene wie eine LV-Applikation hat so eine harte Kopierfunktion nichts (mehr) zu suchen.

Zitat:Sollte (von der Theorie zumindest) ohne Probleme machbar sein.
Ist es auch.

Zitat:kleines Problem habe ich noch bei anderen Stucts: Strings dürfen dort bis zu 200 Zeichen lang sein, aber auch entsprechend kürzer. Dumm nur, wenn man über Array Subset 200 Bytes abschneidet und die dann mit Byte Array to String umwandelt... Aber da sollte man auch die "Nullterminierung" des Strings im Bytearray vorher finden können.
Das mit den 200 Byte im Struct gilt doch aber nur für LV.

Mit Strings - zu denen WideString, AnsiString, PChar etc gehören, sagen wir hier also lieber PChar - ist das sovieso eine eigene Sache. Was tun, wenn der "String" nicht als Zeichen (wie im Struct, also als expliziter Wert) übergeben wird, sondern als PChar, also als Pointer. Dann wieder per Move... Was tun, wenn es ein Delphi-String ist (was hoffentlich nie in einer DLL vorkommt) ? (WideString weis ich nicht).

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.11.2007, 12:53 (Dieser Beitrag wurde zuletzt bearbeitet: 22.11.2007 13:08 von rolfk.)
Beitrag #12

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Vector Informatik: CAN Anbindung mit XL Treiber v6.4 (über DLL)
' schrieb:Wieso nicht? Genauso habe ich es vor. Die Adresse liefert mir die DLL zurück. Für die 32-Bit Versionen ist die halt 32 Bit lang, für 64 Bit dementsprechend. Aber das könnte man auch hardcodieren. Solange ich weiß wieviele Bytes ich ab der Adresse lesen soll/muss, gebe ich die Anzahl an Bytes und die Adresse an dei Move Funktion und die besorgt mir dann den Inhalt. Sollte (von der Theorie zumindest) ohne Probleme machbar sein. Gibt jetzt (leider) erst mal was anderes zu tun, war gerade so schön dabei...

Das geht zwar im Prinzip so, ist aber ein absoluter Horror. Erstens ist es zigmal mehr Arbeit dann in C eine gescheite Wrapper DLL zu schreiben, die LabVIEW freundlichere Datentypen als Parameter verwendet. Zweitens ist es ein Gefriemel vom sovielsten bis das alles wirklich perfekt stimmt. Drittens ist es qua Unterhaltbarkeit des Programmes schlichtweg ein Alptraum. Nächstes Jahr kommt Vektor villeicht mit Version 6.5 der DLL, mit ein paar "kitzekleinen" Änderungen und Du kannst Dich wieder Stunden- so nicht Tagelang damit rumschlagen um alle Offsets, Bufferlängen und und und wieder korrekt zu bekommen. Mit einer intelligenten WrapperDLL ist das eine Sache von einer Rekompilierung und der C Compiler macht das alles automatisch für Dich.

Zitat:Für dein Tutorial: mach in die DLL ein Struct mit diversen Datentypen, evtl. auch struct im struct (oder noch mit einem union gewürzt) und mach aus den einzelnen Bytes halt wieder die Datentypen, verpack die in einen Cluster und gut ist. Eigentlich simpel (wenn man weiß wie) ;=)

Macht nicht viel Sinn. Die, die C begreifen gehen spätestens hier dazu über um eine Wrapper-DLL zu schreiben und die anderen begreifen es auch mit zig Beispielen nicht, wie man das in LabVIEW ohne potentielle General Protection Fault errors machen kann.

Und hier gehe ich ganz knallhart davon aus dass es besser ist wenn jemand nichts tut, dann etwas das scheinbar funktioniert. Wenn Du die Pointer, Offsets, oder Längen nur ein kleines Bisschen falsch bekommst kann so ziemlich alles passieren von einem unmittelbaren Crash, zu einem Crash irgendwann mal später wenn Du etwas ganz anderes in Deinem Programm tust oder wenn LabVIEW abgeschlossen wird, bis zu korrumpierten VIs die wenn sie auf die Disk zurückgeschrieben werden, nie mehr ladbar sind. Hoffentlich hast Du dann noch ein gutes Backup Pccrash

Zitat:P.S. kleines Problem habe ich noch bei anderen Stucts: Strings dürfen dort bis zu 200 Zeichen lang sein, aber auch entsprechend kürzer. Dumm nur, wenn man über Array Subset 200 Bytes abschneidet und die dann mit Byte Array to String umwandelt... Aber da sollte man auch die "Nullterminierung" des Strings im Bytearray vorher finden können.

Das mache ich indem ich solche structs sowieso als Bytearray definiere. Eine kleine Helperfunktion bekommt dieses Bytearray, einen Startoffset und liefert dann das Arraysubset vom Startoffset bis zum nächsten NULL Byte zurück. Geht nicht anders und C macht das eigentlich auch so, nur hast Du da stdlib Funktionen die direkt NULL terminated Strings lesen können.

Aber ein grosser Teil der heutigen Bufferoverflow Exploits und so weiter geht ja gerade auf solche impliziten Bufferterminationtechniken zurück. Die Art und Weise wie es LabVIEW tut mit expliziten Bufferlänge vorangestellt erlaubt was das betrifft viel sicheren Code, so man dann diesen Längenparameter auch korrekt behandelt, was auch wieder eine Kunst für sich ist, aber damit musst Du Dich eben nur herumschlagen wenn Du auf C Nivau arbeitest.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
Question AutomotiveEthernet mit Vector vxlapi Achim 0 3.951 09.12.2020 12:14
Letzter Beitrag: Achim
  Einbindung der Vector XL Driver Library 5.3 in LabVIEW ... nmoerchen 15 26.532 17.10.2011 07:32
Letzter Beitrag: Mik
  dll Anbindung einer Infrarotkamera florianBO 3 4.417 13.11.2009 15:48
Letzter Beitrag: abrissbirne
  Einbindung der Vector driver libary 6.7 in LabVIEW Langen8 3 7.467 31.07.2009 14:31
Letzter Beitrag: rolfk
  DLL-Anbindung lösen astraios 3 4.811 18.04.2007 11:09
Letzter Beitrag: holterpolter
  dll-Anbindung obrueck 1 8.113 10.02.2005 11:07
Letzter Beitrag: Mario W.

Gehe zu: