1. Hansi Strydom
  2. PowerBuilder
  3. Monday, 8 April 2019 22: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.

Roland Smith Accepted Answer Pending Moderation
  1. Tuesday, 9 April 2019 00:22 AM UTC
  2. PowerBuilder
  3. # 1

SAP in their infinite wisdom changed the memory alignment of structures being passed to external functions when they put out 12.6.

You need to add  progma_pack(1)  after the alias for:

alias for "xxxx;Ansi" progma_pack(1)

Comment
There are no comments made yet.
Roland Smith Accepted Answer Pending Moderation
  1. Tuesday, 9 April 2019 00:23 AM UTC
  2. PowerBuilder
  3. # 2

If you are wondering, progma is a misspelling of the C compiler option pragma.

Comment
There are no comments made yet.
  • Page :
  • 1


There are no replies made for this question yet.
However, you are not allowed to reply to this question.