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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
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.
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)?
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.
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?
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
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!
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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
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