Function URLEncoding(vstrIn)
  dim i
  strReturn = ""
  For i = 1 To Len(vstrIn)
      ThisChr = Mid(vStrIn,i,1)
      If Abs(Asc(ThisChr)) < &HFF Then
         strReturn = strReturn & ThisChr
      Else
         innerCode = Asc(ThisChr)
         If innerCode < 0 Then innerCode = innerCode + &H10000
         Hight8 = (innerCode  And &HFF00)\ &HFF
         Low8 = innerCode And &HFF
         strReturn = strReturn & "%" & Hex(Hight8) &  "%" & Hex(Low8)
      End If
  Next
  URLEncoding = replace(strReturn," ","%20")
End Function

Function URLDecode(enStr)
  dim deStr
  dim c,i,v
  deStr = ""
  for i = 1 to len(enStr)
    c = Mid(enStr,i,1)
    if c = "%" then
      v = eval("&h" + Mid(enStr,i + 1,2))
      if v < 128 then
        deStr = deStr & chr(v)
        i = i + 2
      else
        if isvalidhex(mid(enStr,i,3)) then
          if isvalidhex(mid(enStr,i + 3,3)) then
            v = eval("&h" + Mid(enStr,i + 1,2) + Mid(enStr,i + 4,2))
            deStr = deStr & chr(v)
            i = i + 5
          else
            v = eval("&h" + Mid(enStr,i + 1,2) + cstr(hex(asc(Mid(enStr,i + 3,1)))))
            deStr = deStr & chr(v)
            i = i + 3
          end if 
        else 
          destr = destr & c
        end if
      end if
    else
      if c = "+" or c = "%20" then
        deStr = deStr & " "
      else
        deStr = deStr & c
      end if
    end if
  next
  URLDecode = deStr
End Function

Function isvalidhex(str)
  isvalidhex = true
  str = ucase(str)
  if len(str) <> 3 then isvalidhex = false:exit function
  if left(str,1) <> "%" then isvalidhex = false:exit function
  c = mid(str,2,1)
  if not (((c >= "0") and (c <= "9")) or ((c >= "A") and (c <= "Z"))) then isvalidhex = false:exit function
  c = mid(str,3,1)
  if not (((c >= "0") and (c <= "9")) or ((c >= "A") and (c <= "Z"))) then isvalidhex = false:exit function
End Function

Function bytes2BSTR(vIn)
    strReturn = ""
    For i = 1 To LenB(vIn)
        ThisCharCode = AscB(MidB(vIn,i,1))
        If ThisCharCode < &H80 Then
            strReturn = strReturn & Chr(ThisCharCode)
        Else
            NextCharCode = AscB(MidB(vIn,i+1,1))
            strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
            i = i + 1
        End If
    Next
    bytes2BSTR = strReturn
End Function