1. Clint Maxwell
  2. PowerBuilder
  3. Thursday, 17 May 2018 20:31 PM UTC

I have to open a browser and provide it a URL to navigate to. A portion of it needs to be URL Encoded (aka Percent Encoded), because it is a re-direct URL being passed along as a parameter to a login URL, and it also has parameters of its own.

I've tried the solution below (it presumes that MSScript.ocx is registered on the machine) and it works great when running from the IDE, which in my case is PB2017R2 Build 1769. There only seems to be a 32 bit version of this ocx however, so when a 64 bit executable was created the ConnectToNewObject function started failing with a return code of -3. 

Does anyone know of an alternative way to do URL Encoding from within PB code that will work in a 64 bit exe? 


OleObject lnv_MSScript

lnv_MSScript = Create OleObject

// Create a script object to use for URL Encoding/Decoding

li_RC = lnv_MSScript. ConnectToNewObject ("MSScriptControl.ScriptControl")
If li_RC = 0 Then
lnv_MSScript.language = "javascript"
Messagebox('Error', 'Unable to connect to script control. Return Code = ' + string(li_RC))
End If
ls_LoginURL = 'https://some.url.com/UI/Authentication/Altlogin?'
// Redirect URL
ls_SearchURL = '​/SomePath/SomeOtherPath/Search?'
ls_SearchArgs = 'SomeSearchArg=LuggageCombo&AnotherSearchArg=12345'
ls_Dest = '&dest=' + lnv_MSScript.Eval ( "encodeURIComponent('" + ls_SearchURL + ls_SearchArgs + "')"  )
//Full URL
ls_FullURL = ls_LoginURL + ls_Dest​
Accepted Answer
Roland Smith Accepted Answer Pending Moderation
  1. Thursday, 17 May 2018 20:53 PM UTC
  2. PowerBuilder
  3. # Permalink

See this example:


The n_oauth object has a function of_URLEncode.

Thank you Roland, this has worked great. For any interested, I created an object with the relevant pieces from Roland's example project, and then pasted the export below:




global type nc_urlencode from nonvisualobject

end type

end forward


global type nc_urlencode from nonvisualobject

end type

global nc_urlencode nc_urlencode


forward prototypes

public function string of_nbr2hex (unsignedlong aul_number, integer ai_digit)

public function long of_hex2nbr (string as_hex)

public function string of_urlencode (string as_string)

end prototypes


public function string of_nbr2hex (unsignedlong aul_number, integer ai_digit);

ULong lul_temp0, lul_temp1

Char lc_ret


If ai_digit > 0 Then

   lul_temp0 = Abs(aul_number / (16 ^ (ai_digit - 1)))

   lul_temp1 = lul_temp0 * (16 ^ (ai_digit - 1))

   If lul_temp0 > 9 Then

      lc_ret = Char(lul_temp0 + 55)


      lc_ret = Char(lul_temp0 + 48)

   End If

   Return lc_ret + of_Nbr2Hex(aul_number - lul_temp1, ai_digit - 1)

End If


Return ""

end function


public function long of_hex2nbr (string as_hex);

Integer li_work

String ls_code, ls_hex = '123456789ABCDEF'

Long ll_rc, ll_lp


ls_code = Reverse(Upper(as_hex))

ll_rc = len(ls_code)


For ll_lp = 1 To ll_rc

li_work = li_work + Pos(ls_hex, Mid(ls_code, ll_lp, 1), 1) * (16^(ll_lp - 1))



Return li_work

end function


public function string of_urlencode (string as_string);

String ls_Result, ls_Character

Integer li_Ascii, li_CurChr


li_CurChr = 1

Do Until li_CurChr - 1 = Len(as_string)

ls_Character = Mid(as_string, li_CurChr, 1)

li_Ascii = AscA(ls_Character)

Choose Case li_Ascii

Case 48 To 57, 65 To 90, 97 To 122

// Numbers 0-9, Uppercase A-Z, Lowercase a-z

ls_Result += ls_Character

Case Else

ls_Result = ls_Result + "%" + &

of_Nbr2Hex(AscA(ls_Character), 2)

End Choose

li_CurChr ++



Return ls_Result

end function


on nc_urlencode.create

call super::create

TriggerEvent( this, "constructor" )

end on


on nc_urlencode.destroy

TriggerEvent( this, "destructor" )

call super::destroy

end on

  1. Clint Maxwell
  2. Wednesday, 23 May 2018 17:43 PM UTC
There are no comments made yet.
Chris Pollach @Appeon Accepted Answer Pending Moderation
  1. Thursday, 17 May 2018 20:43 PM UTC
  2. PowerBuilder
  3. # 1

Hi Clint;

  You could try the INET object in PB if you are using v12.6 or lower. If you are on the new PB2017 release or higher, you can now use the new HTTP Client object.


Regards .. .Chris

Thanks Chris. I had looked at using the httpclient object for this, but didn't really see how to supply it the url string and then get it back with the special characters url encoded (ie hex converted). Do you have a code snip that shows this?

  1. Clint Maxwell
  2. Wednesday, 23 May 2018 17:33 PM UTC

String        ls_command = "GET"                                                                            // HTTP Command

ii_rc            =    io_http.Sendrequest ( ls_command, is_state_url )

ii_rc            =    io_http.getResponseBody ( ls_data )                                        // Get Response body

Note: The GetResponseBody ( ) method can also handle the BLOB data type as well.

         You can also specify either an ANSI or Unicode encoding too.


  1. Chris Pollach @Appeon
  2. Wednesday, 23 May 2018 20:18 PM UTC
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.