(27.04.2015 11:41 )R.Fuertig schrieb: Kannst du dies näher erläutern?
Was Gerd sagt! Ein DLL Aufruf passiert außerhalb der Kontrolle von LabVIEW. LabVIEW hat grundsätzlich keinerlei Möglichkeit um zuverlässig festzustellen ob während der Ausführung etwas illegales gemacht wird. Es hat zwar Möglichkeiten entsprechende Exceptions abzufangen und Dir dann den bekannten Dialog zu zeigen, dass etwas Illegales passiert ist und dass es sinnvoller wäre abzubrechen und ganz neu zu starten, aber mehr nicht und nicht jede illegale Operation verursacht solche Exceptions. Sie können auch einfach Speicher überschreiben der dann erst später Probleme verursacht wenn LabVIEW versucht auf diesen Speicher zuzugreifen und die Information darin beispielsweise als Zeiger interpretieren will. Das kann scheinbar sogar gut gehen bis LabVIEW abgeschlossen wird und es beim Aufräumen im Speicher über irgendwann davor korrumpierte Speicherstellen stolpert.
Mögliche Ursachen dafür können sein:
1) Sehr beliebt: Ein Buffer der an die Funktion übergeben und in den die Funktion Informationen schreiben soll aber in LabVIEW nicht ausdrücklich auf die nötige Länge initialisiert wird. Jeder C Programmierer weiß dass das so nicht geht hat aber meist auch schon einen solchen Fehler produziert. In LabVIEW ist dieser Fehle extra leicht gemacht da ein LabVIEW Programmierer sich im Normalfall nicht darum kümmert ob ein String oder Array vor dem Aufruf einer Funktion groß genug ist um die erwartete Information empfangen zu können, da jede LabVIEW Funktion sich selber darum kümmert um solche Strings und Arrays dynamisch auf die richtige Größe zu resizen bevor sie etwas hineinschreibt. Das geht aber für C Funktionen nicht (oder nicht ohne sehr viele extra Komplikationen zu verursachen).
2) Falsche Call Library Node Konfiguration die nicht mit der Signatur der Funktion übereinstimmt.
3) Last but not least: Ein Programmierfehler in der DLL, Und nein auch wenn die DLL in einem C Programm zu funktionieren scheint braucht das noch nicht auszuschließen dass ein solcher Fehler besteht. Die DLL könnte in einem kleinen Programm schlichtweg keine lebenswichtigen Daten zerstören, da das Memorylayout ganz anders aussieht oder das C Programm bemüht sich gar nicht am Ende alles sauber aufzuräumen und verlässt sich auf das Betriebssystem dass alle allozierten Speicherbereiche wieder freigegeben werden. Das ist bei Programmende im Prinzip zulässig aber nicht ganz sauber.