![]() |
DLL soll von LabView genutzt werden
Ich schreibe eine DLL die von LabView genutzt werden soll.
Der Aufruf einer Funktion mit 2 Zahlen als Parameter und einem numerischen Rückgabewert klappt, ist auch cdecl deklariert. Nur Strings sind ein Problem. Daher habe ich mal zum Testen die folgende einfache Routine geschrieben, welche von LabView aufgerufen werden soll, aber das crasht immer. Momentan hier: "Exception beim Stringrückliefern", wenn ich vor den CalcRes Übergabeparameter ein var setze, crasht es gleich hier: "Exception in Berechnung". Woran könnte es liegen? Eigentlich sollte der Aufrufer einen Null-Terminierten String übergeben und die Anzahl der Zeichen inkl. #0 die er allokiert hatte in CalcRes. Die Funktion liefert dann wenn genügend Zeichen allokiert wurden das Rechenergebnis als String zurück (hier halt zum Testen), ansonsten wird zurückgeliefert, wieviele Bytes benötigt werden. Dann kann der AUfrufer das nochmal mit einem richtig dimensionierten String aufrufen. Hier der Code:
Delphi-Quellcode:
Grüße
uses
System.SysUtils, System.AnsiStrings; function Add(Number1, Number2: UInt8; CalcRes: PAnsiChar; var CalcResSize: UInt8): UInt16; cdecl; var Res : UInt16; ResStr : AnsiString; begin try Res := Number1 + Number2; ResStr := AnsiString(Res.ToString); except On E:Exception do begin OutputDebugString(PWideChar('Exception in Berechnung: ' + E.Message)); Result := 2; Exit; end; end; try if Assigned(CalcRes) and ((Length(ResStr) {* SizeOf(Char)} + 1) <= CalcResSize) then begin System.AnsiStrings.StrPLCopy(CalcRes, ResStr, CalcResSize); Result := 0; end else Result := 1; except On E:Exception do begin OutputDebugString(PWideChar('Exception beim Stringrückliefern: ' + E.Message + ' / ' + madExcept.GetCrashStackTrace)); Result := 2; Exit; end; end; try CalcResSize := (Length(ResStr) {* SizeOf(Char)} + 1); except On E:Exception do begin OutputDebugString(PWideChar('Exception in CalcResSize Berechnung: ' + E.Message + ' / ' + madExcept.GetCrashStackTrace)); Result := 2; Exit; end; end; end; TurboMagic |
AW: DLL soll von LabView genutzt werden
gelöscht
|
AW: DLL soll von LabView genutzt werden
Linkst du uns noch die Dokumentation von Labview zum Thema Stringübergabe an externe DLLs?
Damit wir auf einen gemeinsamen Stand sind. |
AW: DLL soll von LabView genutzt werden
Hallo,
gib doch mal die Übergangsparameter per MessageBox aus. Ich denke, die Datentypen stimmen nicht. Wie sieht die Deklaration in LabView aus? |
AW: DLL soll von LabView genutzt werden
Hallo,
danke für die Antworten. Problem ist seit gestern Abend gelöst. Nimmt man PChar und Move oder eine andere Stringkopierfunktion als StringLPCopy funktioniert es, wenn der AUfrufer dann auch noch den CalcResSize Parameter richtigerweise als Pointer in der vom Labview wohl eingelesenen Header-Datei angibt. Das hat am Ende gefehlt, der Parameter ist schließlich ein Var Parameter bei mir. Der Aufrufer hat daran aber nicht gedacht, dass ein Parameter in dem auch was zurückkommt bei ihm ein Pointer sein muss. Grüße TurboMagic |
AW: DLL soll von LabView genutzt werden
Schön das ihr das Problem lösen könntet.
Nur als nebensächliche zur Info: LabView kann auch stdcall als Aufrufkonvention. |
AW: DLL soll von LabView genutzt werden
Danke für die Info, hab' ich bereits gesehen, die zukünftigen Nutzer der DLL haben aber cdecl gefordert,
damit das ggf. auch mal als .so oder so unter Linux genutzt werden kann und da ist stdcall scheinbar unüblich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz