' schrieb:Hi Jens,
dieses VI funktioniert auch, ist das get_unit_info.vi!
Was hier nun anderst ist, es werden noch die Variablen string_length und line übergeben, was so nicht in der Doku zur DLL stand.
TOLL!
Das funktioniert soweit auch, aber sobald nur ein paar mehr Dinge parallel im Program passieren, so stürzt LabVIEW weiterhin ab.
Nun habe ich im Taskmanager des Windows XP die Priorität der LabVIEW.exe auf höchste Priorität gesetzt.
So funktioniert es. Was kann man da dauerhaft machen?
Das kann auch gar nicht anders dann einen Crash geben. Schau Dir mal die CLN für die get_unit_info Funktion an. Dort übergibst Du der Funktion als zweiten Parameter einen leeren String. Ein leerer String ist aber ganz einfach ein Pointer auf einen Speicherbereich von 0 Bytes Länge. Als dritten Parameter gibst Du dann die Zahl 256 die als Namen string_length hat. Also gehe ich mal davon aus dass Du damit der DLL Funktion mitteilst hier hast Du einen String von 256 Bytes und bitte schreib mir da mal Deine Info rein. In Wirklichkeit gibst Du ihr aber einen Stringbuffer von 0 Bytes Länge. Die DLL kann nicht wissen dass Du sie verarscht hast und schreibt frisch fröhlich alles was sie zu sagen hat in den Speicher den der übergebene Pointer angibt bis zu der maximal angegeben Länge (oder weniger wenn sie nicht soviel zu sagen hat) und überschreibt Informationen in dahinterliegenden Speicherbereichen die von LabVIEW für anderweitige Zwecke verwendet werden.
Früher oder später versucht LabVIEW diese Informationen wieder zu interpretieren (zum Beispiel könnte es die Definition des Frontpanels enthalten die LabVIEW lesen muss wenn ein Neuzeichnen des Panels nötig ist). Die Information ist aber inzwischen durch die DLL zerstört und enthält aus Sicht von LabVIEW nur noch Mist, et voila -> Crash.
Wenn Du der DLL angibst dass Du da 256 Bytes als Buffer zur Verfügung stellst, musst Du diesen Buffer auch in LabVIEW explizit anlegen. So funktioniert nun einmal C Programmierung, wo der Aufrufer alle Speicherbereiche die von einer Funktion verwendet werden auch von irgendwo wiederverwenden oder anders selber anlegen muss. Zwar kann und wird LabVIEW dieses Memorymanagement für Dich automatisch erledigen solange Du in LabVIEW bleibst. Aber die DLL Schnittstelle hat keine Mechanismen die eine solche automatische Speicherverwaltung zuliesse und so bist Du da halt in der Situation des C Programmierers der sich um alle diese "Kleinigkeiten" selber kümmern muss.
Nun weisst Du endlich auch warum Du in LabVIEW programmierst und nicht in C!
Wie macht man das in LabVIEW? Ganz einfach: Erzeuge mit "Initialize Array" ein Array of (unsigned) Bytes mit der nötigen Länge. Wenn Die DLL Funktion wirklich einen String zurückgibt dann konvertierst Du dieses Array mit der Byte Array To String Funktion noch in einen String und übergibst ihn als C String Pointer. Sonst kann man das Array auch gleich als C Array Pointer of unsigned Bytes übereben. Der einzige Unterwschied zwischen einem Parameter der als C String Pointer oder C Array Pointer übergeben wird ist dass LabVIEW bei einem C String Pointer nach der Rückkehr der DLL Funktion diesen String bis zur maximalen Länge auf ein NULL Byte absucht und den String bei erfolgreichem Fund auf diese Länge einkürzt.
Rolf Kalbermatter