LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

DLL Fehler 1097

Solved!
Go to solution

Hallo,

ich habe beim Aufruf einer DLL die in Delphi geschrieben wurde ein Problem.
Die Funktion lautet: OpLaByMaNu(matnum:LPSTR):BOOL;stdcall;

Der Typ des Übergabeparameters habe ich als String angegeben. Als String-Format habe ich alle Möglichkeiten ausprobiert.
Wenn ich aber das Programm starte und der Knoten "Aufruf externer Bibliotheken" aufgerufen wird wird der LabVIEW Fehler 1097 ausgegeben.

Was muss ich an den Knoten anschließen damit der Parameter der DLL richtig übergeben wird?

Vielen Dank für euere Hilfe.

0 Kudos
Message 1 of 10
(4,572 Views)

@LV_Anwender wrote:

Hallo,

ich habe beim Aufruf einer DLL die in Delphi geschrieben wurde ein Problem.
Die Funktion lautet: OpLaByMaNu(matnum:LPSTR):BOOL;stdcall;

Der Typ des Übergabeparameters habe ich als String angegeben. Als String-Format habe ich alle Möglichkeiten ausprobiert.
Wenn ich aber das Programm starte und der Knoten "Aufruf externer Bibliotheken" aufgerufen wird wird der LabVIEW Fehler 1097 ausgegeben.

Was muss ich an den Knoten anschließen damit der Parameter der DLL richtig übergeben wird?

Vielen Dank für euere Hilfe.


LPSTR sollte ein C String Pointer sein. Ubergibst Du der Funktion einen String den diese liest oder ist der String gedacht dass die Funktion etwas da hinein schreiben soll?

Wenn die Funktion etwas hineinschreiben soll musst Du wissen was die maximale Stringlänge ist, die die Funktion in den Buffer schreiben will und dann musst Du diesen Buffer vor dem Aufruf der Funktion in LabVIEW bereitstellen. Dazu gibt es zwei Möglichkeiten:

 

1) Initiliaze Array mit Type uInt8 und als Länge minimal die maximale Stringlänge + 1, Dann ByteArray to String und dann als C String Pointer and die Funktion übergeben.

 

2) In neueren LabVIEW Versionen kannst Du in der Call Library Node direkt eine minimale Länge angeben die der Funktion übergeben werden muss.

Rolf Kalbermatter
My Blog
0 Kudos
Message 2 of 10
(4,542 Views)

Danke für die schnelle Antwort.

 

Ich übergebe der Funktion einen String, der von dieser gelsen werden soll.

 

Ich habe Punkt 1) und Punkt 2) ausprobiert. Bekam aber immer noch den LabVIEW Fehler 1097.

LPSTR ist ein C-String-Pointer, richtig. Die DLL erwartet aber keine bestimmte Länge, nur den Typ LPSTR.

 

Ich habe LabVIEW 2014 und kann auch die Mindestlänge angeben und hab diese auch wie beschrieben angegeben. Doch auch dabei wird ein Fehler ausgegeben.

0 Kudos
Message 3 of 10
(4,528 Views)

Funktioniert die DLL denn wenn sie aus "normalen" C aufgerufen wird (also nicht Delphi)? Oder gibt das da auch schon Fehler?

 

Was macht die DLL denn mit dem String? Sobald sie in den String schreibt (so verstehe ich das hier auch) muss der Speicher vorallokiert sein. Sollte nicht bekannt sein, wieviel die DLL schreibt, empfehle ich, einen grosszuegig angelegten String zu uebergeben. Rolf hat schon sehr genau beschrieben, wie sich so etwas erstellen laesst.

 

Norbert

Norbert
----------------------------------------------------------------------------------------------------
CEO: What exactly is stopping us from doing this?
Expert: Geometry
Marketing Manager: Just ignore it.
0 Kudos
Message 4 of 10
(4,522 Views)

@LV_Anwender wrote:

Danke für die schnelle Antwort.

 

Ich übergebe der Funktion einen String, der von dieser gelsen werden soll.

 

Ich habe Punkt 1) und Punkt 2) ausprobiert. Bekam aber immer noch den LabVIEW Fehler 1097.

LPSTR ist ein C-String-Pointer, richtig. Die DLL erwartet aber keine bestimmte Länge, nur den Typ LPSTR.

 

Ich habe LabVIEW 2014 und kann auch die Mindestlänge angeben und hab diese auch wie beschrieben angegeben. Doch auch dabei wird ein Fehler ausgegeben.


Für einen String der von der DLL Funktion gelesen wird brauchts keine Mindestlänge. Die Länge des Eingangspuffers ist bereits gegeben durch den String den Du übergibst.

Die einzigen Dinge die ich in diesem speziellen Fall noch sehe sind folgende:

 

1) Ist in Delphi ein LPSTR dasselbe wie der Windows API Datentyp LPSTR? Delphi Strings sind bei Default immer Unicode Widechar Strings, Windows LPSTR is definitiv ein ASCI String. Windows Unicode wäre LPWSTR. Wenn der Delphi String LPSTR mit dem Windows Typ LPSTR übereinstimmt, gibt es in Delphi auch einen LPCSTR? Denn das ist eigentlich was Du hier an die Funktion übergibst.

 

2) Bist Du sicher dass die Funktion stdcall ist? Hast Du das in der Call Library Node entsprechend eingestellt?

 

Ausser diesen zwei Punkten kann ich mir nicht erklären wie Du hier einen 1097 Error bekommen kannst.

Rolf Kalbermatter
My Blog
0 Kudos
Message 5 of 10
(4,520 Views)
Zu Punkt 1) muss ich noch schauen.

2) Bin mir sicher das die Funktion stdcall ist und hab dieses auch eingestellt.

Kann es sein das die DLL intern irgendwie auf Fehler läuft, und der Fehler dort nicht behandelt wird, und deswegen ich in LabVIEW einen Fehler bekomme?
0 Kudos
Message 6 of 10
(4,500 Views)

@LV_Anwender wrote:
Zu Punkt 1) muss ich noch schauen.

2) Bin mir sicher das die Funktion stdcall ist und hab dieses auch eingestellt.

Kann es sein das die DLL intern irgendwie auf Fehler läuft, und der Fehler dort nicht behandelt wird, und deswegen ich in LabVIEW einen Fehler bekomme?

Yep, das ist die 3. Variante in meiner Leiste die ich vergessen habe. Wenn die eine Windows Exception auslöst wird das von LabVIEW abgefangen und als error 1097 umgesetzt.

Rolf Kalbermatter
My Blog
0 Kudos
Message 7 of 10
(4,496 Views)

Google translate has a very interesting interpretation of rolfk's last reply...

 

Yep, that is the 3rd version in my groin which I have forgotten. If an exception is Windows triggers intercepted by LabVIEW and implemented as error 1097.

0 Kudos
Message 8 of 10
(4,488 Views)

@Darin.K wrote:

Google translate has a very interesting interpretation of rolfk's last reply...

 

Yep, that is the 3rd version in my groin which I have forgotten. If an exception is Windows triggers intercepted by LabVIEW and implemented as error 1097.


Autsch, Google takes things sometimes very literally. 🙂 Yes "Leiste" should better have been "Liste" although the meaning is not completely wrong, depending what German dialect you come from. Smiley Very Happy

 

The second part is simply completely wrong due to the different order of words in German and English which most translators don't manage to get right.

 

And I get sometimes into troubles myself, since German, Swiss-German, Dutch and English all are fairly similar languages but with quite some differences in how words are ordered in a sentence.

Rolf Kalbermatter
My Blog
0 Kudos
Message 9 of 10
(4,475 Views)
Solution
Accepted by topic author LV_Anwender

Habe das Problem gelöst.

Die DLL A ruft intern eine weitere DLL B auf. Diese wurde von der ersten DLL A nicht gefunden. Ich habe dann diese DLL B in den Ordner eingefügt in der die LabVIEW.exe liegt. Dann ist der Fehler nicht mehr aufgetreten.

0 Kudos
Message 10 of 10
(4,442 Views)