' schrieb:1. Frage:
Ich übergebe der DLL (dem C-Code) mein Array, und wie gebe ich dann als "Rückgabewert" den Zeiger darauf aus?
Überhaupt nicht, weil sinnlos.
Wegen: Wenn du am Eingang des DLL-Knotens einen Draht, also Daten respektive einen Speicherbereich, anschließt, dann ist nämlich genau dieser Datenbereich nach dem Ende des DLL-Knotens nicht mehr verfügbar. Demzufolge ist auch der Pointer darauf sinnlos (respektive sogar falsch). Überall dort, wo ein Draht aufhört, hört auch die "Beständigkeit" der Daten respektive des Speicherbereiches auf. Wenn du in einer DLL auf einen Datenbereich außerhalb der DLL (auch mittels eines Pointers) schreiben willst, so musst du diesen Datenbereich (respektive den Draht) am Ausgang des DLL-Knotens anschließen. Dann sind die Daten nach dem Ende des DLL-Aufrufes noch vorhanden.
Was nicht - nein, das ist nicht wahr - was nur sehr schwierig geht, ist: Der DLL einen Pointer übergeben, sodass die DLL auch dann noch, wenn der DLL-Knoten bereits beendet ist, auf die Daten außerhalb der DLL zugreifen kann. Dann würden praktisch in der DLL ein Thread quasi parallel zu LV laufen.
Zitat:2. Frage:
Unsere Übergabe einer Struktur an die DLL (kein Pointer) soll laut unserem Projektleiter auch nicht funktionieren.
> Der C-Code
GT_InitChannels(HANDLE hDevice,_AIN analogCh,_DIO digitalCh);
Wurde sowas nicht in einem anderen Thread hier behandelt - und erfolgreich abgeschlossen?
Wenn da im Prototyp steht "_AIN analogCH" dann ist das eine ganz normale "Variable" (die halt auf 8 Werten U8 oder U32 besteht). Da sollte eine Übergabe von 8 einzelnen Werten funktionieren.
Zitat:> Unsere Lösungsidee (alt) Jedes Strukturelement wird einzeln übergeben
Könnt ihr mit Sicherheit ausschließen, dass das falsch ist?
Zitat:> Logische Lösungsidee
Die Strukturelemente werden zu einem Array zusammengefügt und dann erst der DLL übergeben.
Das geht aber nicht: Wenn die DLL am Stack 8 Werte erwartet, kannst du ihr nicht einfach nur einen Wert (nämlich einen Pointer auf ein Array. Hast du so?) geben. => Absturz.
Zitat:3. Frage:
Das ewige Problem der Datenbeschaffung
GT_GetData(HANDLE hDevice,_BUFFER_ST *buffer,LPOVERLAPPED lpOvl);
Es wird auch ein ewiges bleiben. Irgendwo hat alles seine Grenzen.
Denk nur an die Dinos. Kaum fällt da so ein kleiner Stein auf die Erde, sterben sie vollends aus. Wer überlebt? Die kleinen, katzenartigen Säuger (, die es bereits schon gab). [*OhIchSchweifeAb*]
Einen Pointer in einer Struktur zu haben, die selbst als Pointer überegben wird, geht nicht. - Zumindest solange nicht, bis ich (oder wer auch immer) das Gegenteil per Sourcecode bewiesen habe. Das hängt damit zusammen, dass ein Datenbereich nur solange gültig ist, wie der Draht dazu existiert. Kein Draht, kein Datenbereich, kein permanenter Pointer.
Und nicht, dass du jetzt denkst, da zieh ich einfach einen Draht auf ein Schieberegister einer Whileschleife. So einfach ist das nicht. Ab einer Verzweigung ist der Darht neu, also ein anderer Speicherbereich. Sowas würde nur mit Ausgängen eines DLL-Knotens gehen.