xsharp.eu • RKSV Lib - Page 4
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,

Code: Select all

text as ref string
ist doppelt gemoppelt - geht auch in VO nicht.
Entweder

Code: Select all

text as string
oder

Code: Select all

text ref string
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