LabVIEWForum.de
Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern (/Thread-Einbinden-einer-DLL-mit-mehr-Output-Parametern-als-Input-Parametern)



Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern - Herm - 09.06.2011 10:34

Hallo,

Ich beschäftige mich im Rahmen meiner Studienarbeit seit kurzem mit Labview und besonders mit dem Einbinden von DLLs.
Die DLL die ich in Labview einbinden soll besitzt drei Input-Parameter und sieben Output-Parameter. Die Output-Parameter erhalten in der DLL ihre Input-Werte, aber Labview verlangt für jeden Parameter einen Input.
Mit welchen Modulen bzw. Werten kann ich die Input-Stellen der Output-Parametern belegen, damit Labview mit dieser DLL arbeiten kann?

Grüße

Herm


RE: Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern - rolfk - 09.06.2011 12:37

(09.06.2011 10:34 )Herm schrieb:  Hallo,

Ich beschäftige mich im Rahmen meiner Studienarbeit seit kurzem mit Labview und besonders mit dem Einbinden von DLLs.
Die DLL die ich in Labview einbinden soll besitzt drei Input-Parameter und sieben Output-Parameter. Die Output-Parameter erhalten in der DLL ihre Input-Werte, aber Labview verlangt für jeden Parameter einen Input.
Mit welchen Modulen bzw. Werten kann ich die Input-Stellen der Output-Parametern belegen, damit Labview mit dieser DLL arbeiten kann?

Grüße

Herm

Was sind den das für Output Parameter? Für jeden Funktionsparameter musst Du einen korrekten Call Library Node Parameter konfigurieren. Inputparameter werden meist By Value (kein Pointer) übergeben wenn es Skalars sind. Outputparameter werden immer By Reference (als Pointer übergeben). Das muss man für den jeweiligen Parameter auch korrekt in der CLN Konfiguration festlegen.

Auch Outputparameter müssen durch den Aufrufer bereitgestellt werden, wobei hier der Wert meist nicht wichtig ist, aber die korrekte Speichergrösse umso mehr. Das ist vor allem wichtig wenn Du Strings oder Arrays hast in die die DLL Funktion etwas einfüllen soll. LabVIEW kann nicht wissen wie gross diese Strings oder Arrays sein müssen und macht deshalb auch keinerlei Anstalten das für Dich zu erledigen, ganz im Gegensatz zu allen anderen Situationen wenn Du ganz innerhalb LabVIEW bleibst. Daher darf man nicht vergessen den entsprechenden Buffer mittles Initilialize Array (und für Strings dann noch Byte Array to String) diesen Buffer vor dem Aufruf korrekt anzulegen. Sonst gibt es ganz hässliche Effekte da die DLL Speicher überschreibt den Sie nicht überschreiben darf da sie frisch fröhlich in den angebenen Speicher des Parameters schreibt der aber dazu nicht gross genug ist.

Also das was im Wire ist den Du an die Eingangsseite eines Outputparameters anschliesst ist meist völlig unwichtig, dass da aber ein Speicher vorhanden ist der gross genug ist für die Funktion um dass was sie gerne mitteilen möchte da auch hineinzuschreiben umso mehr.


RE: Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern - Herm - 09.06.2011 13:18

Hey,

Vielen Dank für deine Antwort, ich habe die Parameterliste als Anhang eingefügt.
Die Output Parameter sind 32 Bit Integer, zwei 32 Bit Arrays und ein vorzeichenloser 8 Bit Array.
Bei den Integer habe ich bislang einfache Konstanten als Input verwendet und bei den Arrays habe ich Arrays mit eingebundenen "Numerischen Bedienelementen" verwendet, da ich nicht weiß, wie groß die Arrays werden und so müssten die Arrays ihre Größe anpassen können. Die Größe der Arrays ist vom eingebundenen Bild abhängig und das wechselt ständig. Alternativ kann ich natürlich die Arrays mit sehr großen Weiten inizialisieren.


RE: Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern - rolfk - 14.06.2011 11:12

(09.06.2011 13:18 )Herm schrieb:  und bei den Arrays habe ich Arrays mit eingebundenen "Numerischen Bedienelementen" verwendet, da ich nicht weiß, wie groß die Arrays werden und so müssten die Arrays ihre Größe anpassen können. Die Größe der Arrays ist vom eingebundenen Bild abhängig und das wechselt ständig. Alternativ kann ich natürlich die Arrays mit sehr großen Weiten inizialisieren.

Die Arrays müssen vor dem Aufruf in der Grösse anelegt werden die die Funktion maximal benützt. Eine C Funktion kann nicht einfach ein Array eben schnell mal grösser machen wenn das nötig ist. So funktioniert C halt einfach nicht. Das geht nur innerhalb eines spezifischen Frameworks wo sowohl der Aufrufer als auch der Aufgerufene sich ganz spezifisch darauf geeinigt haben, wie Speicher verwaltet wird und so. Das ist bei einer DLL grundsätzlich nicht gegeben, da sie von x-beliebigen Clients aufgerufen werden kann (Delphi, Visual Basic, Borland C, Viusual C, Gnu C application, LabVIEW, etc.) Der kleinste gemeinsame Teiler all dieser Systeme ist dass der Aufrufer für den Aufruf ALLEN Speicher zur Verfügung stellt den die DLL Funktion für Ausgabeparameter benötigt.

Normalerweise muss man die Arrays nicht einfach vorsorgehalber mit sehr grossen Grössen anlegen da man die Funktionen innerhalb eines Kontextes aufruft. In diesem Kontext ist die maximale Grösse meist eindeutig in der Dokumenation erwähnt (so nicht, den entsprechenden Programmierer an eine Schandpfahl binden und dort ein paar Tage schmoren lassen und dann die Komponente weit wegwerfen).

Aber das hier ist leider ziemlich grosses Pech:

* NOTE: histogram, circleList and display are allocated inside the function, so make sure to
* free the corresponding memory to avoid memory leaks!

Das heisst das die DLL Fumktion selber diese Speicher anlegt. Das unterstützt LabVIEW nicht direkt. Zwar kannst Du diese drei Parameter als Pointersized Integers, passed as Pointer definieren aber dann bekommst Du halt nur diesen Pointer zurück. Damit kann LabVIEW selber nichts tun. Wenn Du die Information in diesen Pointern benötigst ist das einzige was Du damit tun kannst, eine andere C Funktion aufrufen um die Daten aus diesem Pointer in ein richtiges LabVIEW Array zu kopieren. Such dazu nach MoveBlock hier, auf lavag.org und forums.ni.com und Du wirst viele Posts mit entsprechenden Informationen finden. Aber ohne etwas BasisverstÄndnis von C und C Pointern wird das eine sehr schmerzhafte Übung.