LabVIEWForum.de
C-String-Zeiger Format - 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: C-String-Zeiger Format (/Thread-C-String-Zeiger-Format)

Seiten: 1 2


RE: C-String-Zeiger Format - hansi9990 - 09.01.2021 07:53

Hallo Freddy

Die Anleitungen hatte ich schon gefunden und gelesen, das Problem ist auch nicht das importieren der dll sondern erstmal nur die Funktion "DapiOpenModuleEx" , hier wird im header der Eingang "exbuffer"als C-String-Zeiger definiert, das wird dann so auch importiert und wie hier die Daten übegeben werden ist nicht genau beschrieben.


RE: C-String-Zeiger Format - Martin.Henz - 09.01.2021 08:59

Was in exbuffer steht, das hattest du ganz am Anfang doch beschrieben - so ganz verstehe ich nicht, womit du nun nicht klar kommst.

Zitat:typedef struct
{
unsigned char address[256];
ULONG timeout;
ULONG portno;

ULONG encryption_type;
unsigned char encryption_password[32];
} DAPI_OPENMODULEEX_STRUCT;

Du musst jetzt einen String zusammenbasteln der diese Daten in der Reihenfolge enthält wie es im Header-File angegeben ist.


RE: C-String-Zeiger Format - hansi9990 - 09.01.2021 10:51

Ich oute mich mal und sage das ich keine Ahnung von C habe und den Aufbau des Struct zwar etwas verstanden habe, aber nicht wusste wie ich das in LabView umsetzen muss, mir war nicht klar wie ich die Datentypen so zusammensetzen muss damit da am Ende der richtige String raus kommt.
Mit Hilfe von "IchSelbst2 habe ich das dann umgesetzt und das Ergebis weiter oben angehängt.
Gesten habe ich dann endlich das Modul bekommen und konnte es testen, aber leider funktioniert es nicht, was wohl bedeutet das ich einen Fehler gemacht habe, aber nur welchen?


RE: C-String-Zeiger Format - Martin.Henz - 09.01.2021 13:43

Hallo Hansi,

so ganz ohne irgend etwas ist das etwas schwierig.

Was mir aber auffällt ist, dass es

(a) Der Hersteller gar nicht beschreibt, was da als letzter Parameter eigentlich übergeben wird.
(b) Es auch die Funktion DapiOpenModule gibt, bei der man vermutlich nur zuvor das DELIBConfiguration Utility verwenden muss um IP Nummer usw. festzulegen.

Hast du (b) schon einmal probiert...

Bezüglich (a) müsste näheres in den Header-Files stehen ... oder einfach mal direkt an den Hersteller wenden.


RE: C-String-Zeiger Format - IchSelbst - 09.01.2021 14:18

(09.01.2021 10:51 )hansi9990 schrieb:  aber leider funktioniert es nicht
Was passiert denn, wenn es nicht funktioniert: Nichts? IDE stürzt ab (auch erst dann, wenn sie beendet wird)? Was spricht denn der Error-Ausgang vom DLL-Knoten? Kann man beim Modul einen Fehler nachfragen? Kann man einen Status abfragen?


RE: C-String-Zeiger Format - hansi9990 - 09.01.2021 14:42

Hi

Danke für dein Antwort, ich habe das Problem gerade herausgefunden, hatte deine info mit dem "höchstwertigen Teil" falsch interpretiert, ich beötige ja für Port, Timeout und Encrytion Type little Endian.
Es ist weder etwas abgestürzt noch hatte man am Fehlerausgang eine Meldung gesehen, es lief einfach durch. Jetzt geht es aber.

Was mich noch etwas verwirrt hat, im Headerfile sind EncryptionType und Password definiert, im Beispiel sind diese beiden Eintrräge ganz weg gelassen und bei mir funktioniert es auch wenn ich das ganz weg lasse und den String um dies 36 Zeichen kürzer sende. Sowas ähnliches hattest du ja auch schon in deiner ersten Antwort geschrieben, nur das du meintest hier sollte mit null aufegüllt werden, das scheint nicht nötig zu sein.


RE: C-String-Zeiger Format - IchSelbst - 09.01.2021 15:13

(09.01.2021 14:42 )hansi9990 schrieb:  das scheint nicht nötig zu sein.
Hier muss ich aber sagen: Der Scheint trügt! Noch schlimmer: Das ist gefährlich!
Wenn in der Beschreibung steht, dass der Datensatz soundsoviele Zeichen hat, kannst du nicht einfach 36 weniger machen. Streng genommen bedeutet ein Zugriff auf einen von 36 nicht vorhandenen Speicherplätze eine Access-Violation (AV). Das dumme daran ist, dass es nicht zwangsläufig zu einer AV kommen muss. Außerdem: Eine AV in einer DLL muss noch nicht zwangsläufig zu einer AV in LV führen. Und es geht noch zwei Stufen schlimmer: Irgendwann stürzt LV ab an einer Stelle, die mit deinem Modul überhaupt nichts zu tun hat. Das Schlimmste aber ist: Es passiert Monate lang nichts - aber dann.

Wenn im Beispiel irgendeinem Parameter kein Wert zugewiesen wurde, heißt das aber nicht, dass der Speicher, in dem die Parameter stehen, nicht alle Parameter enthält. Auch die, denen kein Wert zugewiesen wurde, befinden sich im Speicher - halt mit mindestens undefiniertem Inhalt (meistens ist der Compiler aber so intelligent, dass er beim Anlegen der Variable die Variable löscht, also alles Null).


RE: C-String-Zeiger Format - hansi9990 - 09.01.2021 17:49

Ok, danke für die Warnung.Top1
Irgendwie scheint das aber nur vorgesehen zu sein, so ganz verstehe ich auch nicht welches Passwort das sein soll, es gibt zwar eines für das WebIF des Moduls aber das funktioniert hier nicht. Evtl. ist das auch vom Hersteller nur mal als Platzhalter drin und wird in einem späteren Release aktivert.
Da ich es nicht benötige wird es mir erst dann auf die Füße fallen wenn der Bedarf dafür da ist. Wall


RE: C-String-Zeiger Format - hansi9990 - 09.01.2021 20:09

PS: Ahh ok, es ist doch eine Passwortabfrage in das Modul integriert, man muss sie über das WebIF des Moduls aktivieren dann funktioniert das auch.

So wäre dann alles geklärt, vielen Dank für eure Unterstützung.


RE: C-String-Zeiger Format - rolfk - 25.08.2023 12:16

Ich gebe zu dass der Header einigermassen verwirrend ist und den Parameter als C String definiert aber anscheinend eine Struct haben möchte. Nicht so schön. Allerdings ist die Datentypbezeichnung im Header einfach eine Information, wenn da anstelle davon wirklich eine flache C Structur als Pointer übergeben werden soll ist das auch in LabVIEW so machbar!

Dazu muss man aber ein bischen basteln und baut man einen Cluster mit folgenden Elementen:

Der erste String muss man als einen Cluster mit 256 uInt8 Elementen definieren.
Dann kommen die drei uInt32 Integers
Und zuletzt kommt noch mal ein Cluster mit 32 uInt8 Elementen

Diesen Cluster verbindet man an den Call Library Node Parameter der als Adapt to Type konfiguriert ist. Das sieht dann ungefähr so aus:

[attachment=62561]