Page 1 of 2
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 6:32 am
by lagraf
Ich verwende in meinen Kassenprogrammen die SerialLib von Ginny zur Ansprache von seriellen Kundendisplays. Ich erhalte beim compilieren den Fehler
Code: Select all
error XS9002: Parser: unexpected input 'Callback'
weil er die Callback Funktion CommWatchProc nicht mag.
Gibt es da bereits eine Umsetzung für X#?
LG Franz
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 6:45 am
by wriedmann
Hallo Franz,
das ist ein Fehler im XPorter - er entfernt das Attribut "callback" bei der Funktions-Definition nicht.
An und für sich wäre es sinnvoll, diese Klasse für .NET komplett neu zu schreiben.
Für eine Umsetzung nach X# sehe ich aber auch so keine größeren Probleme.
Vielleicht sollte sich das jemand anschauen.
Wolfgang
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 7:45 am
by TimothyS
Hi Franz,
Excuse the English. I had the exact same problem when I was porting my VO app to Vulcan. Ended up using the DotNet serial class. Easy to do and works well.
Regards,
Tim
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 8:06 am
by Chris
Guys,
I agree with Tim, better just use the .Net classes instead. But good point about VOXporter needing to take care of this, can you please one of you guys send me that library for test purposes (I had never used it myself in VO)?
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 8:42 am
by lagraf
Hi Chris
This is the Lib I use with VO 2.x!
Franz
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 9:01 am
by Chris
Thank you! So I see the problem does not have to do with the CALLBACK keyword, but it's that VOXporter tries to declare the delegate in the middle of a multi line expression, will take care of this.
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 9:07 am
by lagraf
Hallo Wolfgang,
bist du da sicher? Im Code knallt der XPorter die Static Local Definition genau zwischen die Parameter des Aufrufs hinein, die gehört doch darüber?
Code: Select all
BEGIN SEQUENCE
// Create 2nd thread to watch for comm event
ptrCommWatchThread := CreateThread( ; // Use VO Wrapper to CreateThread()
NULL, ; // pointer to security attributes
0, ; // initial thread stack size
#warning Callback FUNCTION modified TO use a DELEGATE by xPorter. Please review.
// @CommWatchProc(), ; // pointer to thread function
STATIC LOCAL oCommWatchProcDelegate := CommWatchProc AS CommWatchProc_Delegate
System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(oCommWatchProcDelegate), ; // pointer to thread function
struCommData, ; // argument for new thread - no '@'
; // because AS STRUCTURE IS pointer already
0, ; // creation flags for thread
@dwWorkerThreadID) // pointer to returned thread ID
...
END SEQUENCE
LG Franz
Ooops, Chris was 6 mins faster!
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 9:20 am
by lagraf
Was mir auch noch auffällt sind 2 warnings, die eigentlich unsinnig sind:
Code: Select all
warning XS0170: Use of possibly unassigned field 'hEvent'
Der Code gekürzt
Code: Select all
METHOD Read( nMaxLength )
...
BEGIN SEQUENCE
struOverlapped.hEvent := CreateEvent(NULL, TRUE, FALSE, NULL)
IF struOverlapped.hEvent == NULL // Hier keine warning
...
END SEQUENCE
IF struOverlapped.hEvent != NULL // Hier die warning!!!
...
Warum wird hEvent 1x angemeckert und ein anders Mal nicht?
Bei der Methode Write das gleiche!
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 9:24 am
by wriedmann
Hallo Franz,
das hat damit zu tun, dass die Variable hEvent innerhalb einer Begin-End Sequence besetzt wird, und nach dieser abgefragt wird.
Wenn es in CreateEvent() zu einem Fehler kommt, wird die Variable hEvent effektiv nicht besetzt.
Um diese Warning wegzubekommen, solltest Du vor dem begin sequence den Wert Null zuweisen.
Wolfgang
Serial Lib von Ginny
Posted: Fri Jan 17, 2020 9:57 am
by lagraf
Alles klar,
aber weiß der Compiler nicht, dass das Programm auf jeden Fall 1x beim CreateEvent vorbeikommt? Außerhalb von BEGIN SEQUENCE und END SEQUENCE wird es doch nie vorbeilaufen?
Franz