RKSV Lib

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

Post Reply
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

RKSV Lib

Post by lagraf »

In all meinen Kassenprogrammen verwende ich für die österr. Registrierkassensicherheitsverordnung (RKSV) eine C# Dll zum Erstellen des QR-Codes und zur Signierung mittels Smartcard. Dafür habe ich eine VO Wrapper Lib, welche die OLE Lib benötigt. Beim Import nach X# erhalte ich die Meldung

Code: Select all

Library OLE not found
Was bedeutet das für meinen Wrapper? Wie bekomme ich ihn zum Laufen?
LG Franz
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

RKSV Lib

Post by wriedmann »

Hallo Franz,
die VO-Wrapper-Lib kannst Du komplett vergessen - verwende einfach die C#-Lib direkt!
COM/OLE geht in einer migrierten App nicht.
OCX-Controls muß man in WinForms-Controls einbinden, aber Dein Code wird hier definitiv einfacher.
Unter .NET kannst Du Assemblies aller .NET-Sprachen beliebig mischen.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

RKSV Lib

Post by lagraf »

Hallo Wolfgang,
damit ich nicht alle Aufrufe in meinen Kassenprogrammen ändern muss, wäre es sinnvoll, den Wrapper so umzuschreiben, dass er als Zwischenstück funktioniert!

Wie binde ich die C# Dll ein, gibt es da ein Beispiel, welche ich mir ansehen kann?

LG Franz
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

RKSV Lib

Post by wriedmann »

Hallo Franz,
klar kannst Du den Wrapper so umschreiben, dass er dieselbe Schnittstelle hat wie die VO-Version, wäre auch so anzuraten.
Um eine C#-Library einzubinden, kannst Du sie einfach in den References hinzufügen.
Dann musst Du noch den Namespace kennen und die Klassen - oder Du schaust Dir das Ganze mit dem ILSpy an. Wenn Du den noch nicht hast: es gibt ein Plugin dafür, daß Dir dann z.B. C# Code als X# anzeigt (so weit möglich):
https://www.xsharp.eu/itm-downloads?fol ... %252FTools

Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

RKSV Lib

Post by lagraf »

Hallo Wolfgang,
der ILSpy zeigt mir eine ganze Liste an Namespaces: von RKSV.Common.Configuration bis RKSVComComplete.Properties, was davon ist für mich interessant?

In meinem Wrapper rufe ich nur eine Klasse auf: RKSVCOM{}

Code: Select all

// RKSVCom initialisieren
_oRKSVCom := RKSVCOM{}
IF !_oRKSVCom:fInit
	_cMsgLast := _RKSV_INIT
	_cMsgFirst:= IIF(Empty(_cMsgFirst), _cMsgLast, _cMsgFirst)
	_oRKSVCom := NULL_OBJECT
	RETURN SELF
ENDIF	
Die Methoden dieser Klasse sind mit Parameter und Return Value bekannt, verwende ich ja im Wrapper, z.B:

Code: Select all

METHOD GetReaderAt(nPos AS WORD;	// Position des Readers
		) AS STRING PASCAL CLASS RKSV
// Ermittelt den Readernamen für Reader Nummer (0-n) und speichert diesen in _cReader
// -> Return: Readername oder NULL_STRING
	
LOCAL uRet AS USUAL

uRet := _oRKSVCom:GetReaderAt(nPos)
IF ValType(uRet) <> "C" .OR. Empty(uRet)
	_cMsgLast := StrTran(_RKSV_GetReaderAt, "%POS%", AsString(nPos))
	_cMsgFirst:= IIF(Empty(_cMsgFirst), _cMsgLast, _cMsgFirst)
	RETURN NULL_STRING
ENDIF
	
_cReader := uRet
RETURN uRet
Läßt sich damit was anfangen?
Franz
Attachments
ILSpy.jpg
ILSpy.jpg (177.98 KiB) Viewed 573 times
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

RKSV Lib

Post by wriedmann »

Hallo Franz,
dann würde ich mal in der Assembly nach einer solchen Klasse suchen.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

RKSV Lib

Post by lagraf »

Hallo Wolfgang,
Fehler von mir, die C# Klasse heißt RKSVComComplete, RKSVCom war noch von mir!

Code: Select all

METHOD Init(ObjID, fROTCHECK) CLASS RKSVCOM
	SELF:cIID := "{987E40A2-2708-3453-B906-A8849E9BDA00}"
	SELF:cProgId := "RKSVComComplete"
	SELF:cClsId :=  "{9A79D6C4-A084-4D27-9D0D-AAE7703571B0}"

	IF (ObjID=NIL)
		ObjId := "RKSVComComplete"
	ENDIF
	SUPER:Init(ObjID, 0, .T., fRotCheck)
	SELF:_dwFuncs	:= 39
	SELF:_dwVars 	:= 0
	RETURN SELF
Wenn ich jetzt daraus eine Methode verwenden möchte, z.B. GetReaderAt, wie kann ich die Klasse direkt verwenden und die Methode daraus aufrufen?
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

RKSV Lib

Post by wriedmann »

Hallo Franz,

wenn Du den betreffenden Namespace in einem Using-Statement angibst, kannst Du die Klasse wie eine normale X#/VO Klasse instanzieren und verwenden - das ist kein Unterschied, denn das ist effektiv genau so eine .NET Klasse wie alle anderen Methoden in Deiner migrierten Applikation.
Gegenüber VO und COM wird das Ganze schneller und sicherer (keine Konvertierung der Parameter mehr über COM und genaue Typ-Prüfung).
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

RKSV Lib

Post by lagraf »

Hallo Wolfgang,
gibt es eine Möglichkeit in X#, sich die Aufrufe wie unter VO (Tools / Automation Server) generieren zu lassen, oder ist alles Handarbeit?
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

RKSV Lib

Post by wriedmann »

Hallo Franz,

das brauchst Du nicht - Du kannst die Methoden direkt aufrufen, und der Compiler prüft sogar die Parameter, bzw XIDE/Visual Studio helfen da sogar mit Intellisense.
Den Zwischenschritt gibt/braucht es nicht mehr.

Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply