INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Daten einer Struktur aus LV einer DLL übergeben



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

05.05.2007, 22:09
Beitrag #8

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.704
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Daten einer Struktur aus LV einer DLL übergeben
Hallo Predoator!

Bei deinem Problem der Übergabe einer Struktur über den Stack an eine DLL bin ich zu folgendem Ergebnis gekommen.

Code:
typedef struct_IN_WRITE_SPECIAL
{
BOOL bSperre
UCHAR uchSendeimpluls
UCHAR uchSendeenergie
BOOL bSendeempfangsmode
.
.
.
}
Die Abfolge dieser Struktur ist folgende: Bool1 = 4 Byte; UCHAR1 = 1 Byte; UCHAR2 = 1 Byte; Bool2 = 4 Byte; etc. Das an sich ist kein Problem. Jede Programmiersprache (respektive der Prozessor) kann den unterschiedlich langer Zugriff handeln. Einmal eben 4 Byte für Bool1 = normaler 32Bit-Zugriff. Zweimal 1 Byte = quasi-normaler 8Bit-Zugriff. Bool2 = nicht nomaler 32Bit-Zugriff. Die Nicht-Normalität liegt darin, dass die 32Bit nicht an einer durch vier teilbaren Adresse anfangen. Der Prozessor kann das zwar, aber eigentlich nur über Umwege. Eine solche Struktur würde man als "gepackte Struktur" bezeichnen. (Eine nicht gepackte Struktur wäre es, wenn auch die 1Byte-Werte in einem 32Bit-Speicher abgelegt werden; nicht gepackte Strukturen sind Standard). Soweit sogut.

Wenn nun eine Funktion als Parameter eine (gepackte) Struktur wie diese hat, dann verlangt sie wohl auch genau diese Bit-Aufteilung für diesen Parameter im Speicher.

Im DLL-Knoten sind aber alle Parameter 32Bit breit (oder vielfachen davon)! Auch ein Char oder ein Word wird mit 32Bit übertragen! Zu diesem Ergebnis bin ich gekommen, weil mein Prototyp Chars enthält, und ich in LV für diesen Parameter I32 angeben kann - und umgekehrt.

Wenn man also die (gepackte) Struktur durch ihrer Elemente ersetzt, so geht das in einfacher Weise nur dann gut, wenn alle Elemente 32Bit (oder vielfaches) haben.

Was heißt das jetzt für dich?

Wenn es mit dem Ersetzen der Struktur durch ihre Elemente nicht funktioniert hat, dann gehen wir davon aus, dass die Struktur eben gepackt ist. Es muss genau die richtige Anzahl Bytes im Stack übergeben werden. Du kannst jetzt folgendes probieren: Erster Paremeter im DLL-Knoten: Bool1; Zweiter Parameter = UCHAR1+ 256*UCHAR2 + 65536*lowword(Bool2); Ditter Prameter = highword(Bool2) ...; usw; (Alle Parameter I32.) Beachte: Ich glaube du hast sieben Parameter, die zusammen unglücklicherweise kein Vielfaches von 32Bit ausmachen. Wenn du großes Glück hast, funktioniert das vielleicht. Möglicherweise musst du in diese manuelle Zusammenfassung der Werte auch noch den dritten Paramter (den Pointer) mit aufnehmen.

Wenn diese spezielle C++-Funktion aber tatsächlich eine Stackbelegung so erwartet, dass der Gesamtspeicherverbrauch über alle Parameter kein Vielfaches von 32Bit ist, dann sehe ich schwarz. Respektive kann ich dann wohl nicht mehr weiter helfen, da hier auch meine Testmöglichgkeiten beschränkt sind.

Habe ich das mit der Speicherbelegung etc. verständlich erklärt?

Ansonsten viel Erfolg mit dem DLL-Knoten!

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
Daten einer Struktur aus LV einer DLL übergeben - IchSelbst - 05.05.2007 22:09

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Problem bei Aufruf einer dll swoc 5 3.593 08.09.2022 17:01
Letzter Beitrag: Martin.Henz
  Fehlercode 1097 beim Aufrufen einer C++ DLL Dr. Nuke 11 6.839 22.07.2022 22:39
Letzter Beitrag: Martin.Henz
  Struktur mit Zeiger auf weitere Struktur an DLL übergeben Wheeliemaster 2 7.679 27.05.2015 08:40
Letzter Beitrag: Wheeliemaster
  statische Klassen einer dll .Net C# in LabView ansprechen Programmierknecht 2 6.420 25.06.2013 12:01
Letzter Beitrag: rolfk
  Cluster der Array enthält als Ausgabe-Parameter einer dll SchwindelInside 4 7.345 07.12.2012 12:51
Letzter Beitrag: SchwindelInside
  Keine Funktionen in einer Geräterhersteller-.dll ansprechbar LäbViju 4 6.746 30.11.2011 15:15
Letzter Beitrag: LäbViju

Gehe zu: