Page 4 of 7
RKSV Lib
Posted: Mon Jan 20, 2020 7:04 pm
by wriedmann
Hallo Franz,
wenn Du schon neuen Code schreibst: bitte typisieren:
Code: Select all
class RKSV
protect _oRKSVCom as RKSVCOM
method ConvertJWSCompactToText(cJws as string) as logic
local cResult as string
local cAnswer as string
local lRet as logic
cResult := ""
cAnswer := ""
lRet := _oRKSVCom:ConvertJWSCompactToText(cJws, cResult, cAnswer )
return lRet
end class
Die Methode hat einen Rückgabewert vom Typ logic.
Ausserdem sind die beiden Parameter als ref definiert, und brauchen nicht mit dem @ verwendet zu werden.
System.IntPtr ist ein Pointer auf eine Int-Variable.
Zumindestens die Interface-Klasse solltest Du neu schreiben, bzw. mit bedingter Compilierung:
Code: Select all
method ConvertJWSCompactToText(cJws as string) as logic
local cResult as string
local cAnswer as string
local lRet as logic
cResult := ""
cAnswer := ""
#ifdef __XSHARP__
lRet := _oRKSVCom:ConvertJWSCompactToText(cJws, cResult, cAnswer )
#else
lRet := _oRKSVCom:ConvertJWSCompactToText(cJws, @cResult, @cAnswer )
#endif
return lRet
Wolfgang
RKSV Lib
Posted: Mon Jan 20, 2020 9:12 pm
by FFF
Heißt die App evtl. so wie die Klasse ? Das mag .net nicht...
RKSV Lib
Posted: Tue Jan 21, 2020 7:17 am
by lagraf
Hallo Wolfgang,
ich versuche es nochmal zu spezifizieren anhand dieser einen Methode. Ich habe mein Interface von RKSVCom auf RKSVINT umgetauft, damit die Namensgleichheit mit der Klasse RKSVCom aus RKSVComComplete wegfällt:
Code: Select all
// Meine Klasse, die ich aus meinen Programmen anspreche
// Davon mal abgesehen, dass RKSV nicht vom Compiler akzeptiert wird
// Die App heißt _RKSV 1.76 und nicht RKSV, sollte also nicht das Namensproblem verursachen
// Methoden decken sich großteils mit gleichnamigen aus RKSVInt aber nicht mit allen
CLASS RKSV
PROTECT _oRKSVINT AS RKSVINT // Interfaceklasse für RKSVCom aus RKSVComComplete von ITG
METHOD ConvertJWSCompactToText(cJws AS STRING) AS STRING PASCAL
// Wandelt einen JWS-String in normalen Text um
// -> Input: JWS-String
// -> Return: Umgewandelter JWS-String oder NULL_STRING
LOCAL cResult AS STRING // Rückgabe aus RKSVCom: Umgewandelter JWS-String
LOCAL cAnswer AS STRING // Rückgabe aus RKSVCom: Fehlertext
LOCAL lRet AS logic
// Die beiden REF Parameter müßten doch mit @ angegeben werden, zumindest in VO wars so?
lRet := _oRKSVINT:ConvertJWSCompactToText(cJws, @cResult, @cAnswer) // [1]
// Anhand der Rückgabe aus RKSVCom werden Rückgabewert oder Fehlermeldung erstellt
DO CASE
CASE Empty(cResult)
_cMsgLast := "Kein gültiger JWS-String"
_cMsgFirst:= IIF(Empty(_cMsgFirst), _cMsgLast, _cMsgFirst)
CASE !lRet
_cMsgLast := StrTran(_RKSV_ConvertJWSCompactToText, "%ERROR%", cAnswer)
_cMsgFirst:= IIF(Empty(_cMsgFirst), _cMsgLast, _cMsgFirst)
cResult := NULL_STRING
ENDCASE
RETURN cResult
// Interfaceklasse für RKSVComComplete von ITG
// Wird nicht direkt aus meinen Programmen angesprochen
// Entsprach in VO den generierten Prototypen
USING RKSVComComplete
CLASS RKSVINT
PROTECT _oRKSVCom AS RKSVCom // Klasse aus RKSVComComplete von ITG
METHOD ConvertJWSCompactToText(;
jwsCompact AS STRING,; // AS STRING
text AS STRING,; // REF STRING
errorMessage AS STRING; // REF STRING
) AS LOGIC
LOCAL lRetValue AS logic
// Wenn X# den @ nicht braucht, dann lassen wir ihn mal weg
lRetValue := _oRKSVCom:ConvertJWSCompactToText(jwsCompact, text, errorMessage) // [2]
RETURN (lRetValue)
Das bringt den Fehler
Code: Select all
error XS1503: Argument 2: cannot convert from 'System.IntPtr*' to 'string" bei [1]
Gebe ich die beiden @ bei [1] jedoch weg, bekomme ich die Warning
Code: Select all
warning XS9071: Parameter 2 needs a(n) 'Ref' modifier. This modifier was automatically added bei [2]
Gebe ich den @ bei [2] dazu, compiliert X# ohne Fehler.
Laut Compiler wäre dann der REF Parameter in meiner Klasse RKSV [1] ohne und im Interface RKSVINT [2] mit @, also genau umgekehrt!
Aber funktioniert das dann auch, wie ist das mit verschachtelten REF Parametern?
RKSV Lib
Posted: Tue Jan 21, 2020 7:33 am
by wriedmann
Hallo Franz,
das ist der Fehler:
Code: Select all
METHOD ConvertJWSCompactToText(;
jwsCompact AS STRING,; // AS STRING
text AS STRING,; // REF STRING
errorMessage AS STRING; // REF STRING
) AS LOGIC
sollte sein:
Code: Select all
METHOD ConvertJWSCompactToText(;
jwsCompact AS STRING,; // AS STRING
text REF STRING,; // REF STRING
errorMessage REF STRING; // REF STRING
) AS LOGIC
Hast Du ja sogar im Kommentar so stehen!
Wolfgang
RKSV Lib
Posted: Tue Jan 21, 2020 9:43 am
by lagraf
Hallo Wolfgang,
die Kommentare sind von VO, nicht von mir
Ich hatte es schon ähnlich probiert, und zwar mit "AS REF STRING", das wollte der Compiler aber nicht!
Ich habe jetzt alles sauber typisiert lt. Angaben in ILSpy, damals hat VO die Parameter der OLE Methoden beim Generieren nicht typisiert und der Return-Wert war immer usual. Damit sind jetzt alle Fehler weg, mit Ausnahme der
Code: Select all
error XS0246: The type or namespace name 'RKSV' could not be found (are you missing a using directive or an assembly reference?)
wo er meine Klasse RKSV nicht erkennt. Bleibt wohl nur mehr die Möglichkeit, sie umzutaufen und alle Aufrufe in den Kassenprogrammen zu ändern, wenn du keine Idee mehr hast.
LG und vielen Dank, Franz
RKSV Lib
Posted: Tue Jan 21, 2020 9:49 am
by wriedmann
Hallo Franz,
ist doppelt gemoppelt - geht auch in VO nicht.
Entweder
oder
Leider können die VO-Klassen nicht streng typisiert sein....
Was das Nicht-Finden des RKSV betrifft: ist das in Deiner Applikation drin oder eine eigene Lib?
Wenn es eine eigene Lib ist, muss die logischerweise in den References der Applikation angegeben werden.
Wolfgang
RKSV Lib
Posted: Tue Jan 21, 2020 10:29 am
by lagraf
Hallo Wolfgang,
wie bei #12816 beschrieben, habe ich folgende Klassen in der RKSV Lib:
- RKSV: Ist die Basisklasse, die in meinen Programmen verwendet wird
- RKSVInt: Ist die Interfaceklasse, deren Methoden die Verbindung zwischen RKSV und der Dll herstellt
- RKSVCom: Ist die Klasse aus der Dll
Und dann gibt es noch diverse Funktionen, welche die RKSV Klasse bereits in der Lib verwenden, genauso wie in meinen Programmen. Dort kommt der Fehler beim Instantiieren von oRKSV := RKSV{oOwner}.
RKSV Lib
Posted: Tue Jan 21, 2020 10:33 am
by wriedmann
Hallo Franz,
also Deine Lib, in der die Klasse RKSV definiert ist, kompiliert fehlerfrei?
Und beim Kompilieren der Applikation bekommst Du die Fehlermeldung?
Hast Du in der Lib einen Namespace angegeben? Entweder mit "begin namespace" oder in den Eigenschaften der Lib? Wenn ja, musst Du diesen Namespace in der Applikation mit "using ..." angeben.
Wolfgang
RKSV Lib
Posted: Tue Jan 21, 2020 10:52 am
by lagraf
Hallo Wolfgang,
ich bin noch immer bei der RKSV Lib, dort bekomme ich die Fehler in den Funktionen, wo ich auf die Klasse RKSV zugreife. Alles befindet sich in der gleichen Lib (siehe #12822). Bei der App bin ich noch nicht, da erst die identischen Fehler in der Lib weg müssen.
RKSV Lib
Posted: Tue Jan 21, 2020 10:55 am
by wriedmann
Hallo Franz,
dann mache mal einen Export der Lib, zippe sie zusammen und häng sie hier dran - oder schick sie mir per Mail.
Sonst schreiben wir hier noch zulange rum.
Wolfgang