- Hansi Strydom
- PowerBuilder
- Monday, 8 April 2019 10:10 PM UTC
Hi all
I just wanted to find out if anyone else has run into a similar issue as mine, and if so, how to get around this.
I am doing development on an app which was originally written in Powerbuilder 8, and which interacts with a serial device via COM port. The compiled version of the Powerbuilder 8 app runs on Windows 10 and can correctly interact with the COM port.
However, the same code compiled in Powerbuilder 17 (the Powerbuilder 8 workspace was converted to Powerbuilder 17) when running on the same machine as the Powerbuilder 8 version accessing the same COM port fails. I am not sure if something has changed in terms of COM port communications between the Powerbuilder versions, or whether the same COM port interaction needs to be done differently in Powerbuilder 17.
The extract of the code where it fails is as follows:
if BuildCommDCBA( ConnectString, istr_DCB_used ) = 0 then
MessageBox( "Communications Error ...", "Open ("+as_CommPort+") failed: Could not build Device Control Block." &
+ "~nPlease check setting string: [" + ConnectString + "].~n" + getpreviouserror() )
return const_il_invalidhandle
end if
if SetCommState( il_handle, istr_DCB_used ) = false then
MessageBox( "Communications Error ...", &
"Set State [" + string(as_CommPort) + "] failed.~nPlease check setting string: [" &
+ ConnectString + "].~n" + GetPreviousError() )
ClosePort()
return const_il_invalidhandle
end if
The code fails when it gets to the SetCommState() call, and through investigation and debugging in Powerbuilder 8 and Powerbuilder 17, it is clear that in Powerbuilder 17, the istr_DCB_used structure does not get populated with the values in ConnectString and consequently, the code fails when it gets to the SetCommState() call because the structure has not been populated with the necessary values.
The value of ConnectString is like this "baud=1200 parity=N data=8 stop=1". I might have the baudrate wrong, but the rest is correct, and the value of ConnectString is identical in both compiled versions.
The BuildCommDCBA and SetCommState functions are both external Windows functions, and the declarations for these in the Powerbuilder source code are as follows:
Function long BuildCommDCBA ( string lpDef, REF istr_DCB lpDCB) library "kernel32" alias for "BuildCommDCBA;Ansi"
Function boolean SetCommState (long hCommDev, REF istr_DCB lpDCB) library "kernel32" alias for "SetCommState;Ansi"
The istr_DCB_used structure structure has the following layout:
long dcblength
long baudrate
integer varwords
character bytesize
character parity
character stopbits
character xonchar
character xoffchar
character errorchar
character eofchar
character evtchar
long wreserved1
When this app was originally created it was obviously for a version of Windows older than Windows 10, but as far as I can see the signatures of the external functions have not changed for Windows 10.
I see that according to the Microsoft API documentation for the BuildCommDCBA function, there are additional properties in the structure that are not in the structure above. I have tried adding all of them, but that did not resolve the error either, and remember that the problem in this case is not that the app does not work on Windows 10, but rather that the Powerbuilder 8 version of the app works on Windows 10, but not the same code converted to Powerbuilder 17, which is really puzzling.
I will really appreciate any assistance in solving this conundrum.
Find Questions by Tag
Helpful?
If a reply or comment is helpful for you, please don’t hesitate to click the Helpful button. This action is further confirmation of their invaluable contribution to the Appeon Community.