(25.08.2011 06:25 )Jochen_BW schrieb: Hallo Daniel,
ohne es jetzt zu wissen, einfach mal eine Vermutung ins Blaue hinein. C keine keine Strings in dem Sinne sonderen nur Char Arrays. Versuch doch mal anstatt einem String ein Arry of U8 an die DLL zu übergeben. Gibt in der String Palette auch eine Funktion zum Umwandlen. Unter Umständen noch eine 0(Stringende) an das Array anhängen.
Gruß Jochen
Hab mir das eben noch mal angeschaut, als bei mir geht das auch wenn ich nen String übergebe
Lad doch einfach mal Dein VI hoch, dann kann man Dir wohl am besten helfen.
Gruß Jochen
Das ist leider ein wenig verkehrt. C kennt eben schon einen Unterschied zwischen einem String und einem Byte Array. Zwar nicht wie der Speicher selber angelegt ist aber alle C String Funktionen gehen davon aus dass ein String sauber mit einem NULL Character abgeschlossen ist. Ältere Funktionen gehen grundsätzlich nur davon aus, neuere Funktionen haben oft einen extra length Parameter um auf diese Art sogenannte Bufferoverrunfehler sicher vermeiden zu können.
Wenn Du in LabVIEW einen CLN Parameter als Byte Array Pointer konfigurierst, übergibt LabVIEW einfach den Pointer auf die Arraydaten und die Funktion hat besser eine Methode um zu wissen, wie lange das Array ist. LabVIEW macht weiter nichts mit dem Array und fügt auch garantiert keinen NULL Character an das Ende an. Die C Funktion dagegen kann den Längenparameter des LabVIEW Arrays nicht sehen und das heisst entweder dass sie ein Array bestimmter Länge erwartet, was natürlich vom Code im LabVIEW Diagramm auch garantiert werden muss, oder dass sie einen weiteren Funktionsparameter hat mit dem ihr die Arraylänge mitgeteilt wird.
Wenn man in LabVIEW einen CLN Parameter als String Pointer konfiguriert, dann macht LabVIEW einen extra Schritt: an das Ende des Strings, so wie LabVIEW ihn kennt, wird ein NULL Character angefügt und der Pointer auf diesen String wird and die Funktion übergeben. Wenn dieser CLN Parameter auch als String Ausgang benützt wird, dan scannt LabVIEW den Stringbuffer nach Rückkehr der Funktion nach einem NULL Character und passt die Länge des Strings in seiner Datenstruktur entsprechend an.
Was immer die C Funktion tut, man muss im Diagram garantieren dass der Buffer den man übergibt midestens so gross ist wie die Funktion es verlangt. Das gilt sowohl für Eingangsparameter (die von der C Funktion nur gelesen werden) aber noch viel mehr für Ausgangsparameter (in die die Funktion schreibt). Die Effekte bei Missachtung dieser Regel können varieren von scheinbar nichts (aber bei Ausgangsparametern wird immer irgendwie verkehrter Speicher überschrieben), über fehlerhafte Ausführung oder Rechenergebnisse, zu delayed crashes (Exception Dialog wenn LabVIEW später den korrumpierten Speicher für andere Operationen ansprechen will), sofortigen Exception Dialogen, oder gar Totalabschmieren auf der Stelle.