Guten Morgen alle miteinander
Vorerst einmal: die Suche gab keine Ergebnisse, und auch in Google und dergleichen konnte ich nichts finden.
Das Problem: Wir haben als Eingang in unsere DLL mehrere Strukturen
Struktur 1: 8 BOOLsche Werte
Struktur 2: 3 BOOLsche Werte
Struktur 3: SHORT,UINT,UINT
Struktur 4: Char Array
Unser Problem ist nun den richtigen Eingangstyp für die DLLs zu finden.
Eine mögliche Überlegung unsererseits war das die 8 boolschen Werte entweder als 1*8bit (INT) übertragen werden, eine andere das jede mit eigenen 4-Byte Variablen übertragen wird.
Kurz gesagt: wir haben keine Ahnung!!!
Falls jemand erfahrung mit dergleichen Probleme hat so soll er sich bitte melden. Auch Weblinks die dieses Thema umfassen sind erwünscht!
Vielen Dank schon mal im vorraus,
bye
' schrieb:Das Problem: Wir haben als Eingang in unsere DLL mehrere Strukturen
Struktur 1: 8 BOOLsche Werte
Struktur 2: 3 BOOLsche Werte
Struktur 3: SHORT,UINT,UINT
Struktur 4: Char Array
Ich es jetzt "eure" DLL oder eine "zugekaufte"?
Wenn es eure ist, musst ihr doch wissen, mit welchen Datentypen die Daten übergeben werden. Wenn es eine zugekaufte ist, sollte es hierfür vom Hersteller eine Schnittstellenbeschreibung geben.
Im Übrigen: 8 Boolsche Werte kannst du übertragen wie du willst. Das kommt auf die Schnittstelle an. Alle 8 in einem U8 ist zwar platzsparend, ob sinnvoll kommt auf die Applikation an. Boolsche Werte kann man aber auch pro Wert in U8 (Standard) oder U16 oder U32. Bei 8 Werten wird mal dann wohl einen Pointer auf Bool nehmen.
Es ist leider nicht unsere eigene. Das Problem ist nur das der Hersteller gerade sehr wenig Zeit hat und wir deswegen noch nicht nachfragen konnten. Also gibt es keine allgemeine Vorschrift dafür?
Danke, ich werde mich mal mit dem Herausgeber zusammenreden!
' schrieb:Das Problem ist nur das der Hersteller gerade sehr wenig Zeit hat
Faule Ausreden.
Zitat:Also gibt es keine allgemeine Vorschrift dafür?
Nein, ich kenne keine. Bei unendlich vielen Möglichkeiten, Daten zu übertragen, macht eine Vorschrift, die das abdecken will, keinen Sinn.
Zitat:Danke, ich werde mich mal mit dem Herausgeber zusammenreden!
Im Prinzip würde dir reichen ein Ausdruck vom Funktionskopf. Der wenn noch in C++ ist, wird sich schon jemand finden, der das in LV umsetzt. Vier Strukturen, macht vier verschiedene Funktionsköpfe - vier mal kopieren und mailen. Aufwand: Schneller als ich dieses Posting geschrieben habe. Und dafür hat der Hersteller keine Zeit? Kauft euch was gescheides.
' schrieb:Faule Ausreden.
Also, eine Struktur sieht folgendermaßen aus:
8 * 4 Byte hintereinander für die boolschen Werte
3 * 4 Byte hintereinander für die boolschen Werte
Das haben wir aus dem C-Code durch debugen rausgefunden
Also dachten wir es sei ein 8-Dimensionales (bzw. 3) Array
Vorzeichenbehafteter 32bit Integer
Array Format: Array-Handle
Mit dem Array-Format und dem Vorzeichenbehaftet oder nicht sind wir uns leider nicht sicher.
Der Effekt dieses genialen Programmes ist folgender: Totalabsturz von LabVIEW in unter einer Sekunde *rekord*
HELP
Die Frage in kurzform:
Wie übergebe ich über eine DLL eine Struktur mit 4*8 Byte inhalt (boolsche Werte in 4 Byte konvertiert)?
' schrieb:Also, eine Struktur sieht folgendermaßen aus:
8 * 4 Byte hintereinander für die boolschen Werte
3 * 4 Byte hintereinander für die boolschen Werte
Das haben wir aus dem C-Code durch debugen rausgefunden
Da fehlen jetzt nur noch mehrere wichtige Sachen:
* Aufrufkonvention: Naja, da gehen wird mal von C aus
* Hat die Funktion einen Rückgabewert: Zwar tippe ich auf I32, es würde aber auch viod möglich sein.
* Werden diese acht Werte als Daten übergeben oder wird ein Pointer auf die Daten übergeben? Ich tippe auf Pointer.
Zitat:Also dachten wir es sei ein 8-Dimensionales (bzw. 3) Array
8-Dimensional? Doch eher 1-Dimensional mit 8 Werten.
Zitat:Vorzeichenbehafteter 32bit Integer
Ja. Ob I32 oder U32 dürfte egal sein.
Zitat:Array Format: Array-Handle
Eu-jeu-jeu. Ist zwar schön, aber wer so eine (überall einsetzbare) DLL schreibt - naja. Ich tippe auf Pointer auf Daten. Also: Typ: Array; Datentyp: I32; Array-Format: Array-Datenzeigen.
' schrieb:Da fehlen jetzt nur noch mehrere wichtige Sachen:
* Aufrufkonvention: Naja, da gehen wird mal von C aus
* Hat die Funktion einen Rückgabewert: Zwar tippe ich auf I32, es würde aber auch viod möglich sein.
* Werden diese acht Werte als Daten übergeben oder wird ein Pointer auf die Daten übergeben? Ich tippe auf Pointer.
8-Dimensional? Doch eher 1-Dimensional mit 8 Werten.
Ja. Ob I32 oder U32 dürfte egal sein.
Eu-jeu-jeu. Ist zwar schön, aber wer so eine (überall einsetzbare) DLL schreibt - naja. Ich tippe auf Pointer auf Daten. Also: Typ: Array; Datentyp: I32; Array-Format: Array-Datenzeigen.
Aufrufkonventionen waren bisher immer stdcall, denke nicht das sich das auf den Schlag ändert
Ja, Rückgabewert I32
Die 8 Daten werden als Daten, NICHT als Pointer übergeben
1 Dimensional mit 8 Werten *hm* Zumindest meint unser Projektleiter was anderes
' schrieb:Aufrufkonventionen waren bisher immer stdcall, denke nicht das sich das auf den Schlag ändert
Nun gut, dann muss das halt nur im DLL-Knoten entsprechend angepasst werden.
Zitat:Ja, Rückgabewert I32
=> Anpassen im DLL-Knoten.
Zitat:Die 8 Daten werden als Daten, NICHT als Pointer übergeben
Das hieße aber: der Funktionsaufruf hat 8 Parameter vom Typ Numerisch. Alles andere z.B. mit Array sind immer Pointer. Das siehst du am *, der in der Übergabeliste im DLL-Knoten sichtbar wird.
Zitat:1 Dimensional mit 8 Werten *hm* Zumindest meint unser Projektleiter was anderes
8*1 und 1*8 kommt speicherplatzmäßig aufs gleiche raus.
Habt ihr mal mit dem Pointer auf Array[1..8] probiert?
Nachtrag:
Fehler in der Übergabeliste, besonders wenn Pointer erwartet werden, führen meistens zum Applikations-Absturz - nicht immer, aber oft. Wenn nicht, dann kann es aber trotzdem sein, dass das Applikstionssystem Schaden genommen hat.
Sodala, damit du mal das C-Programm siehst:
<blockquote>typedef struct
{
BOOL ain1;
BOOL ain2;
BOOL ain3;
BOOL ain4;
BOOL ain5;
BOOL ain6;
BOOL ain7;
BOOL ain8;
}_AIN;</blockquote>
<blockquote>typedef struct
{
BOOL scan;
BOOL dio1_direction;
BOOL dio2_direction;
}_DIO;</blockquote>
Funktions Prototyp:
BOOL __stdcall Unterprogramm(HANDLE handle1,_AIN Analog,_DIO Digital);
Also Rückegabewert war noch nie ein Problem
Handle bekommen wir von einer anderen DLL als schönen Wert zurück (Numerisch, 32bit, Zeiger auf Wert)
Für _AIN und _DIO fehlen uns die Ideen. Wie es im C-Speicher aussieht sind das jeweils 8 (bzw. 3) mal 32bit hintereinander. Somit wäre die logische Idee doch insgesamt 32 Byte hintereinander reinzuschicken. Doch wie!?
Also ein 1-D Array mit 8 Werten ist mir komplett neu. Wie erstellt man sowas?
Also sollte noch mal jemand eine Idee haben, wir sind für alle Ideen offen!
' schrieb:Für _AIN und _DIO fehlen uns die Ideen. Wie es im C-Speicher aussieht sind das jeweils 8 (bzw. 3) mal 32bit hintereinander.
Probier halt mal, ab man ein Cluster als Daten (nicht als Pointer auf Daten) übergeben kann. Ansonsten könntest du ja mal ausprobieren, die 1+8+3=12 Werte explizit zu übergeben. Ob du 12 Parameter, von denen jeder 32Bit lang ist, angibst oder 3, von denen einer z.B. 8*32Bit lang ist, sollte eigenlich egal sein - vorausgesetzt es werden Daten und nicht Pointer auf Daten übergeben.