Announcement

Collapse
No announcement yet.

WinHttp*****Url function

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • WinHttp*****Url function

    Can anyone write a working version WinHttp*****Url function in AMC. Already a couple of hours it fails. Keep getting error 87 ("The parameter is incorrect") on Windows 8 x64. Thanks.

  • #2
    Maybe you could share what you have already done, maybe your code is easily fixed.
    Bas Groothedde
    Imagine Programming :: Blog

    AMS8 Plugins
    IMXLH Compiler

    Comment


    • #3
      Of course.
      Code:
      [font=Courier New][size=2]ir_CheckNumArgs [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (tArgs[color=#FF0000],[/color] nArgs) [color=#0000FF][b]if[/b][/color] ([color=#FF0000]#[/color]tArgs [color=#FF0000]<[/color] nArgs) [color=#0000FF][b]then[/b][/color] error(nArgs [color=#FF0000].[/color][color=#FF0000].[/color] [color=#800080]" arguments expected, "[/color][color=#FF0000].[/color][color=#FF0000].[/color][color=#FF0000]#[/color]tArgs[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]" arguments passed."[/color][color=#FF0000],[/color] 2); [color=#0000FF][b]end[/b][/color] [color=#0000FF][b]end[/b][/color]
      
      ir_CheckTypeArgs [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (tArgs[color=#FF0000],[/color] nArg[color=#FF0000],[/color] tTypes)
          [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] [color=#FF0000]#[/color]tTypes [color=#0000FF][b]do[/b][/color] [color=#0000FF][b]if[/b][/color] (type(tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color]) [color=#FF0000]=[/color][color=#FF0000]=[/color] tTypes[color=#FF0000][[/color]i[color=#FF0000]][/color]) [color=#0000FF][b]then[/b][/color] [color=#0000FF][b]return[/b][/color] tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color]; [color=#0000FF][b]end[/b][/color] [color=#0000FF][b]end[/b][/color]
          error([color=#800080]"Bad argument #"[/color] [color=#FF0000].[/color][color=#FF0000].[/color] nArg [color=#FF0000].[/color][color=#FF0000].[/color] [color=#800080]", must be a "[/color][color=#FF0000].[/color][color=#FF0000].[/color](([color=#FF0000]#[/color]tTypes [color=#FF0000]>[/color] 1) [color=#0000FF][b]and[/b][/color] Table[color=#FF0000].[/color]Concat(tTypes[color=#FF0000],[/color] [color=#800080]' or '[/color]) [color=#0000FF][b]or[/b][/color] tTypes[color=#FF0000][[/color]1[color=#FF0000]][/color])[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]", you passed a "[/color][color=#FF0000].[/color][color=#FF0000].[/color]type(tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color])[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]"."[/color][color=#FF0000],[/color] 2);
      [color=#0000FF][b]end[/b][/color]
      
      UCODE [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (sString)
          [color=#0000FF][b]local[/b][/color] pBuf [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]Allocate(2 [color=#FF0000]*[/color] ([color=#FF0000]#[/color]sString [color=#FF0000]+[/color] 1));
          MemoryEx[color=#FF0000].[/color]String(pBuf[color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE[color=#FF0000],[/color] sString);
      
          [color=#0000FF][b]return[/b][/color] pBuf;
      [color=#0000FF][b]end[/b][/color]
      
      ICU_ESCAPE [color=#FF0000]=[/color] 0x80000000;
      
      _WinHttp  [color=#FF0000]=[/color] Library[color=#FF0000].[/color]Load([color=#800080]'winhttp.dll'[/color]);
      _Kernel32 [color=#FF0000]=[/color] Library[color=#FF0000].[/color]Load([color=#800080]'kernel32.dll'[/color][color=#FF0000],[/color] [color=#0000FF][b]false[/b][/color]);
      
      [color=#008000][i]--[[]][/i][/color][color=#008000][i]----------------------------------------------------------------------------------[/i][/color]
      *****Url [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] ([color=#FF0000].[/color][color=#FF0000].[/color][color=#FF0000].[/color])
          ir_CheckNumArgs(arg[color=#FF0000],[/color] 1);
          [color=#0000FF][b]local[/b][/color] sURL  [color=#FF0000]=[/color] ir_CheckTypeArgs(arg[color=#FF0000],[/color] 1[color=#FF0000],[/color] [color=#FF0000]{[/color][color=#800080]'string'[/color][color=#FF0000]}[/color]);
          [color=#0000FF][b]local[/b][/color] nFlag [color=#FF0000]=[/color] ir_CheckTypeArgs(arg[color=#FF0000],[/color] 2[color=#FF0000],[/color] [color=#FF0000]{[/color][color=#800080]'nil'[/color][color=#FF0000],[/color] [color=#800080]'number'[/color][color=#FF0000]}[/color]);
          nFlag       [color=#FF0000]=[/color] nFlag [color=#0000FF][b]or[/b][/color] ICU_ESCAPE;
      
          [color=#0000FF][b]local[/b][/color] pwszUrl [color=#FF0000]=[/color] UCODE(sURL);
          [color=#0000FF][b]local[/b][/color] URL_COMPONENTS [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]DefineStruct[color=#FF0000]{[/color]DWORD([color=#800080]'StructSize'[/color]); UINT([color=#800080]'SchemeName'[/color]); DWORD([color=#800080]'SchemeNameLength'[/color]); INT([color=#800080]'Scheme'[/color]);
                                                       UINT([color=#800080]'HostName'[/color]); DWORD([color=#800080]'HostNameLength'[/color]); WORD([color=#800080]'PORT'[/color]);  UINT([color=#800080]'UserName'[/color]); DWORD([color=#800080]'UserNameLength'[/color]);
                                                       UINT([color=#800080]'Password'[/color]); DWORD([color=#800080]'PasswordLength'[/color]); UINT([color=#800080]'UrlPath'[/color]); DWORD([color=#800080]'UrlPathLength'[/color]); UINT([color=#800080]'ExtraInfo'[/color]); DWORD([color=#800080]'ExtraInfoLength'[/color])[color=#FF0000]}[/color];
      
          [color=#0000FF][b]local[/b][/color] tURL_COMPONENTS [color=#FF0000]=[/color] URL_COMPONENTS[color=#FF0000]:[/color]New();
          tURL_COMPONENTS[color=#FF0000].[/color]StructSize [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]StructSize(URL_COMPONENTS);
      
          [color=#0000FF][b]local[/b][/color] nURLLen [color=#FF0000]=[/color] sURL[color=#FF0000]:[/color]len();
          [color=#0000FF][b]local[/b][/color] tBuffers [color=#FF0000]=[/color] [color=#FF0000]{[/color][color=#FF0000]}[/color];
          [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] 6 [color=#0000FF][b]do[/b][/color]
              tBuffers[color=#FF0000][[/color]i[color=#FF0000]][/color] [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]Allocate(nURLLen [color=#FF0000]+[/color] 1);
          [color=#0000FF][b]end[/b][/color]
      
          tURL_COMPONENTS[color=#FF0000].[/color]SchemeNameLength [color=#FF0000]=[/color] nURLLen;
          tURL_COMPONENTS[color=#FF0000].[/color]SchemeName       [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]1[color=#FF0000]][/color];
          tURL_COMPONENTS[color=#FF0000].[/color]HostNameLength   [color=#FF0000]=[/color] nURLLen;
          tURL_COMPONENTS[color=#FF0000].[/color]HostName         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]2[color=#FF0000]][/color];
          tURL_COMPONENTS[color=#FF0000].[/color]UserNameLength   [color=#FF0000]=[/color] nURLLen;
          tURL_COMPONENTS[color=#FF0000].[/color]UserName         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]3[color=#FF0000]][/color];
          tURL_COMPONENTS[color=#FF0000].[/color]PasswordLength   [color=#FF0000]=[/color] nURLLen;
          tURL_COMPONENTS[color=#FF0000].[/color]Password         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]4[color=#FF0000]][/color];
          tURL_COMPONENTS[color=#FF0000].[/color]UrlPathLength    [color=#FF0000]=[/color] nURLLen;
          tURL_COMPONENTS[color=#FF0000].[/color]UrlPath          [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]5[color=#FF0000]][/color];
          tURL_COMPONENTS[color=#FF0000].[/color]ExtraInfoLength  [color=#FF0000]=[/color] nURLLen;
          tURL_COMPONENTS[color=#FF0000].[/color]ExtraInfo        [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]6[color=#FF0000]][/color];
      
          [color=#0000FF][b]local[/b][/color] nRet [color=#FF0000]=[/color] _WinHttp[color=#FF0000].[/color]WinHttp*****Url(pwszUrl[color=#FF0000],[/color] nURLLen[color=#FF0000],[/color] ICU_ESCAPE[color=#FF0000],[/color] tURL_COMPONENTS[color=#FF0000]:[/color]GetPointer());
          [color=#0000FF][b]local[/b][/color] nError [color=#FF0000]=[/color] _Kernel32[color=#FF0000].[/color]GetLastError();
      
          MemoryEx[color=#FF0000].[/color]Free(pwszUrl); tURL_COMPONENTS[color=#FF0000]:[/color]Free(); [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] 6 [color=#0000FF][b]do[/b][/color] MemoryEx[color=#FF0000].[/color]Free(tBuffers[color=#FF0000][[/color]i[color=#FF0000]][/color]); [color=#0000FF][b]end[/b][/color]
      
          Dialog[color=#FF0000].[/color]Message([color=#800080]"Notice"[/color][color=#FF0000],[/color] nRet[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]' '[/color][color=#FF0000].[/color][color=#FF0000].[/color]nError[color=#FF0000],[/color] MB_OK[color=#FF0000],[/color] MB_ICONINFORMATION[color=#FF0000],[/color] MB_DEFBUTTON1);
      [color=#0000FF][b]end[/b][/color]
      
      *****Url([color=#800080]'http://www.indigorose.com/forums/threads/35330-WinHttp*****Url-function?p=189741#post189741'[/color]);[/size][/font]

      Comment


      • #4
        Code:
        URL_COMPONENTS [COLOR="#FF0000"]=[/COLOR] MemoryEx[COLOR="#FF0000"].[/COLOR]DefineStruct[COLOR="#FF0000"]{[/COLOR]
          DWORD [COLOR="#800080"]"dwStructSize"[/COLOR];
          INT [COLOR="#800080"]"lpszScheme"[/COLOR];
          DWORD [COLOR="#800080"]"dwSchemeLength"[/COLOR];
          INT [COLOR="#800080"]"nScheme"[/COLOR];
          INT [COLOR="#800080"]"lpszHostName"[/COLOR];
          DWORD [COLOR="#800080"]"dwHostNameLength"[/COLOR];
          INT [COLOR="#800080"]"nPort"[/COLOR];
          INT [COLOR="#800080"]"lpszUserName"[/COLOR];
          DWORD [COLOR="#800080"]"dwUserNameLength"[/COLOR];
          INT [COLOR="#800080"]"lpszPassword"[/COLOR];
          DWORD [COLOR="#800080"]"dwPasswordLength"[/COLOR];
          INT [COLOR="#800080"]"lpszUrlPath"[/COLOR];
          DWORD [COLOR="#800080"]"dwUrlPathLength"[/COLOR];
          INT [COLOR="#800080"]"lpszExtraInfo"[/COLOR];
          DWORD [COLOR="#800080"]"dwExtraInfoLength"[/COLOR];
        [COLOR="#FF0000"]}[/COLOR];
        COMP [COLOR="#FF0000"]=[/COLOR] URL_COMPONENTS:New()
        WinHttp  [COLOR="#FF0000"]=[/COLOR] Library[COLOR="#FF0000"].[/COLOR]Load([COLOR="#800080"]'winhttp.dll'[/COLOR]);
        Kernel32 [COLOR="#FF0000"]=[/COLOR] Library[COLOR="#FF0000"].[/COLOR]Load([COLOR="#800080"]'kernel32.dll'[/COLOR]);
        ICU_ESCAPE [COLOR="#FF0000"]=[/COLOR] 0x80000000;
        
        WinHttp*****Url [COLOR="#FF0000"]=[/COLOR] [COLOR="#0000FF"]function[/COLOR](url)
         [COLOR="#0000FF"]local[/COLOR] l [COLOR="#FF0000"]=[/COLOR] (String[COLOR="#FF0000"].[/COLOR]Length(url) + [COLOR="#000000"]1[/COLOR]) [COLOR="#FF0000"]*[/COLOR] [COLOR="#000000"]4[/COLOR]
         [COLOR="#0000FF"]local[/COLOR] m [COLOR="#FF0000"]=[/COLOR] MemoryEx[COLOR="#FF0000"].[/COLOR]Allocate(l)
         MemoryEx[COLOR="#FF0000"].[/COLOR]String(m[COLOR="#FF0000"],[/COLOR]-[COLOR="#000000"]1[/COLOR][COLOR="#FF0000"],[/COLOR]MEMEX_UNICODE[COLOR="#FF0000"],[/COLOR]url)
         COMP[COLOR="#FF0000"].[/COLOR]dwStructSize [COLOR="#FF0000"]=[/COLOR] COMP:Size()
         [COLOR="#0000FF"]if[/COLOR] WinHttp[COLOR="#FF0000"].[/COLOR]WinHttp*****Url(m[COLOR="#FF0000"],[/COLOR]l[COLOR="#FF0000"],[/COLOR]ICU_ESCAPE[COLOR="#FF0000"],[/COLOR]COMP:GetPointer()) [COLOR="#FF0000"]==[/COLOR] [COLOR="#000000"]0[/COLOR] [COLOR="#0000FF"]then[/COLOR]
          [COLOR="#0000FF"]local[/COLOR] E [COLOR="#FF0000"]=[/COLOR] Kernel32[COLOR="#FF0000"].[/COLOR]GetLastError()
          [COLOR="#0000FF"]if[/COLOR] (E [COLOR="#FF0000"]==[/COLOR] [COLOR="#000000"]12004[/COLOR]) [COLOR="#0000FF"]then[/COLOR]
           Dialog[COLOR="#FF0000"].[/COLOR]Message([COLOR="#800080"]""[/COLOR][COLOR="#FF0000"],[/COLOR][COLOR="#800080"]"Internal error"[/COLOR])
          [COLOR="#0000FF"]elseif[/COLOR] (E [COLOR="#FF0000"]==[/COLOR] [COLOR="#000000"]12005[/COLOR]) [COLOR="#0000FF"]then[/COLOR]
           Dialog[COLOR="#FF0000"].[/COLOR]Message([COLOR="#800080"]""[/COLOR][COLOR="#FF0000"],[/COLOR][COLOR="#800080"]"Invalid URL"[/COLOR])
          [COLOR="#0000FF"]elseif[/COLOR] (E [COLOR="#FF0000"]==[/COLOR] [COLOR="#000000"]12006[/COLOR]) [COLOR="#0000FF"]then[/COLOR]
           Dialog[COLOR="#FF0000"].[/COLOR]Message([COLOR="#800080"]""[/COLOR][COLOR="#FF0000"],[/COLOR][COLOR="#800080"]"Non http/https URL"[/COLOR])
          [COLOR="#0000FF"]elseif[/COLOR] (E [COLOR="#FF0000"]==[/COLOR] [COLOR="#000000"]8[/COLOR]) [COLOR="#0000FF"]then[/COLOR]
           Dialog[COLOR="#FF0000"].[/COLOR]Message([COLOR="#800080"]""[/COLOR][COLOR="#FF0000"],[/COLOR][COLOR="#800080"]"Not enough memory"[/COLOR])
          [COLOR="#0000FF"]else[/COLOR]
           Dialog[COLOR="#FF0000"].[/COLOR]Message([COLOR="#800080"]""[/COLOR][COLOR="#FF0000"],[/COLOR][COLOR="#800080"]"Undefined error: "[/COLOR][COLOR="#FF0000"]..[/COLOR]E)
          [COLOR="#0000FF"]end[/COLOR]
         [COLOR="#0000FF"]else[/COLOR]
          Dialog[COLOR="#FF0000"].[/COLOR]Message([COLOR="#800080"]"OK"[/COLOR][COLOR="#FF0000"],[/COLOR][COLOR="#800080"]"Structure should be filed in"[/COLOR])
         [COLOR="#0000FF"]end[/COLOR]
         MemoryEx[COLOR="#FF0000"].[/COLOR]Free(m)
        [COLOR="#0000FF"]end[/COLOR];
        
        url1 [COLOR="#FF0000"]=[/COLOR] [COLOR="#800080"]"http://www.indigorose.com/forums/threads/35330-WinHttp*****Url-function?p=189741#post189741"[/COLOR]
        WinHttp*****Url(url1)
        Can't get this working with ASCII as it throws ERROR_WINHTTP_INVALID_URL but with Unicode it reports as working although I haven't studied this function so don't know what the filed in structure members should be.

        Comment


        • #5
          I dont think you need to pre define the buffers for the returned structure strings as the function allocates buffers for you so you just grab the strings with MemoryEx.String using the pointer in the structure as the MemoryEx.String buffer pointer variable and let the OS free the buffers as the OS created them.

          Comment


          • #6
            Thank you so much for the working example! Now I've found my mistake ... I incorrectly stated the type of nPort field in the URL_COMPONENTS structure. I have it set to 2-byte WORD, but for this field, you must allocate 4 bytes (INT). Because of this, I got the above error.
            I dont think you need to pre define the buffers for the returned structure strings as the function allocates buffers for you so you just grab the strings with MemoryEx.String using the pointer in the structure as the MemoryEx.String buffer pointer variable and let the OS free the buffers as the OS created them.
            Buffers must be pre allocated, in them will be recorded the memory address that stores a string of corresponding element. If the buffers are not allocated, then obtain the address value to 0.

            Comment


            • #7
              The full working version:
              Code:
              [font=Courier New][size=2]ir_CheckNumArgs [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (tArgs[color=#FF0000],[/color] nArgs) [color=#0000FF][b]if[/b][/color] ([color=#FF0000]#[/color]tArgs [color=#FF0000]<[/color] nArgs) [color=#0000FF][b]then[/b][/color] error(nArgs [color=#FF0000].[/color][color=#FF0000].[/color] [color=#800080]" arguments expected, "[/color][color=#FF0000].[/color][color=#FF0000].[/color][color=#FF0000]#[/color]tArgs[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]" arguments passed."[/color][color=#FF0000],[/color] 2); [color=#0000FF][b]end[/b][/color] [color=#0000FF][b]end[/b][/color]
              
              ir_CheckTypeArgs [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (tArgs[color=#FF0000],[/color] nArg[color=#FF0000],[/color] tTypes)
                  [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] [color=#FF0000]#[/color]tTypes [color=#0000FF][b]do[/b][/color] [color=#0000FF][b]if[/b][/color] (type(tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color]) [color=#FF0000]=[/color][color=#FF0000]=[/color] tTypes[color=#FF0000][[/color]i[color=#FF0000]][/color]) [color=#0000FF][b]then[/b][/color] [color=#0000FF][b]return[/b][/color] tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color]; [color=#0000FF][b]end[/b][/color] [color=#0000FF][b]end[/b][/color]
                  error([color=#800080]"Bad argument #"[/color] [color=#FF0000].[/color][color=#FF0000].[/color] nArg [color=#FF0000].[/color][color=#FF0000].[/color] [color=#800080]", must be a "[/color][color=#FF0000].[/color][color=#FF0000].[/color](([color=#FF0000]#[/color]tTypes [color=#FF0000]>[/color] 1) [color=#0000FF][b]and[/b][/color] Table[color=#FF0000].[/color]Concat(tTypes[color=#FF0000],[/color] [color=#800080]' or '[/color]) [color=#0000FF][b]or[/b][/color] tTypes[color=#FF0000][[/color]1[color=#FF0000]][/color])[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]", you passed a "[/color][color=#FF0000].[/color][color=#FF0000].[/color]type(tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color])[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]"."[/color][color=#FF0000],[/color] 2);
              [color=#0000FF][b]end[/b][/color]
              
              UCODE [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (sString)
                  [color=#0000FF][b]local[/b][/color] pBuf [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]Allocate(2 [color=#FF0000]*[/color] ([color=#FF0000]#[/color]sString [color=#FF0000]+[/color] 1));
                  MemoryEx[color=#FF0000].[/color]String(pBuf[color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE[color=#FF0000],[/color] sString);
              
                  [color=#0000FF][b]return[/b][/color] pBuf;
              [color=#0000FF][b]end[/b][/color]
              
              ICU_ESCAPE [color=#FF0000]=[/color] 0x80000000;
              
              _WinHttp  [color=#FF0000]=[/color] Library[color=#FF0000].[/color]Load([color=#800080]'winhttp.dll'[/color]);
              _Kernel32 [color=#FF0000]=[/color] Library[color=#FF0000].[/color]Load([color=#800080]'kernel32.dll'[/color][color=#FF0000],[/color] [color=#0000FF][b]false[/b][/color]);
              
              [color=#008000][i]--[[]][/i][/color][color=#008000][i]----------------------------------------------------------------------------------[/i][/color]
              *****Url [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] ([color=#FF0000].[/color][color=#FF0000].[/color][color=#FF0000].[/color])
                  ir_CheckNumArgs(arg[color=#FF0000],[/color] 1);
                  [color=#0000FF][b]local[/b][/color] sURL  [color=#FF0000]=[/color] ir_CheckTypeArgs(arg[color=#FF0000],[/color] 1[color=#FF0000],[/color] [color=#FF0000]{[/color][color=#800080]'string'[/color][color=#FF0000]}[/color]);
                  [color=#0000FF][b]local[/b][/color] nFlag [color=#FF0000]=[/color] ir_CheckTypeArgs(arg[color=#FF0000],[/color] 2[color=#FF0000],[/color] [color=#FF0000]{[/color][color=#800080]'nil'[/color][color=#FF0000],[/color] [color=#800080]'number'[/color][color=#FF0000]}[/color]);
                  nFlag       [color=#FF0000]=[/color] nFlag [color=#0000FF][b]or[/b][/color] ICU_ESCAPE;
              
                  [color=#0000FF][b]local[/b][/color] pwszUrl [color=#FF0000]=[/color] UCODE(sURL);
                  [color=#0000FF][b]local[/b][/color] nURLLen [color=#FF0000]=[/color] sURL[color=#FF0000]:[/color]len();
                  [color=#0000FF][b]local[/b][/color] tBuffers [color=#FF0000]=[/color] [color=#FF0000]{[/color][color=#FF0000]}[/color]; [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] 6 [color=#0000FF][b]do[/b][/color] tBuffers[color=#FF0000][[/color]i[color=#FF0000]][/color] [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]Allocate(nURLLen [color=#FF0000]+[/color] 1); [color=#0000FF][b]end[/b][/color]
              
                  [color=#0000FF][b]local[/b][/color] URL_COMPONENTS [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]DefineStruct[color=#FF0000]{[/color]
                      DWORD([color=#800080]'StructSize'[/color]);
                      UINT ([color=#800080]'SchemeName'[/color]);
                      DWORD([color=#800080]'SchemeNameLength'[/color]);
                      INT  ([color=#800080]'Scheme'[/color]);
                      UINT ([color=#800080]'HostName'[/color]);
                      DWORD([color=#800080]'HostNameLength'[/color]);
                      INT  ([color=#800080]'Port'[/color]);
                      UINT ([color=#800080]'UserName'[/color]);
                      DWORD([color=#800080]'UserNameLength'[/color]);
                      UINT ([color=#800080]'Password'[/color]);
                      DWORD([color=#800080]'PasswordLength'[/color]);
                      UINT ([color=#800080]'UrlPath'[/color]);
                      DWORD([color=#800080]'UrlPathLength'[/color]);
                      UINT ([color=#800080]'ExtraInfo'[/color]);
                      DWORD([color=#800080]'ExtraInfoLength'[/color])
                  [color=#FF0000]}[/color];
              
                  [color=#0000FF][b]local[/b][/color] tURL_COMPONENTS [color=#FF0000]=[/color] URL_COMPONENTS[color=#FF0000]:[/color]New();
                  tURL_COMPONENTS[color=#FF0000].[/color]StructSize       [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]StructSize(URL_COMPONENTS);
                  tURL_COMPONENTS[color=#FF0000].[/color]SchemeNameLength [color=#FF0000]=[/color] nURLLen;
                  tURL_COMPONENTS[color=#FF0000].[/color]SchemeName       [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]1[color=#FF0000]][/color];
                  tURL_COMPONENTS[color=#FF0000].[/color]HostNameLength   [color=#FF0000]=[/color] nURLLen;
                  tURL_COMPONENTS[color=#FF0000].[/color]HostName         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]2[color=#FF0000]][/color];
                  tURL_COMPONENTS[color=#FF0000].[/color]UserNameLength   [color=#FF0000]=[/color] nURLLen;
                  tURL_COMPONENTS[color=#FF0000].[/color]UserName         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]3[color=#FF0000]][/color];
                  tURL_COMPONENTS[color=#FF0000].[/color]PasswordLength   [color=#FF0000]=[/color] nURLLen;
                  tURL_COMPONENTS[color=#FF0000].[/color]Password         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]4[color=#FF0000]][/color];
                  tURL_COMPONENTS[color=#FF0000].[/color]UrlPathLength    [color=#FF0000]=[/color] nURLLen;
                  tURL_COMPONENTS[color=#FF0000].[/color]UrlPath          [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]5[color=#FF0000]][/color];
                  tURL_COMPONENTS[color=#FF0000].[/color]ExtraInfoLength  [color=#FF0000]=[/color] nURLLen;
                  tURL_COMPONENTS[color=#FF0000].[/color]ExtraInfo        [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]6[color=#FF0000]][/color];
              
                  [color=#0000FF][b]local[/b][/color] tRet [color=#FF0000]=[/color] [color=#FF0000]{[/color][color=#FF0000]}[/color];
                  [color=#0000FF][b]local[/b][/color] nRet [color=#FF0000]=[/color] _WinHttp[color=#FF0000].[/color]WinHttp*****Url(pwszUrl[color=#FF0000],[/color] nURLLen[color=#FF0000],[/color] ICU_ESCAPE[color=#FF0000],[/color] tURL_COMPONENTS[color=#FF0000]:[/color]GetPointer());
                  [color=#0000FF][b]if[/b][/color] (nRet [color=#FF0000]~[/color][color=#FF0000]=[/color] 0) [color=#0000FF][b]then[/b][/color]
                      tRet[color=#FF0000].[/color]SchemeName [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]1[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                      tRet[color=#FF0000].[/color]Scheme     [color=#FF0000]=[/color] tURL_COMPONENTS[color=#FF0000].[/color]Scheme;
                      tRet[color=#FF0000].[/color]HostName   [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]2[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                      tRet[color=#FF0000].[/color]Port       [color=#FF0000]=[/color] tURL_COMPONENTS[color=#FF0000].[/color]Port;
                      tRet[color=#FF0000].[/color]UserName   [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]3[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                      tRet[color=#FF0000].[/color]Password   [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]4[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                      tRet[color=#FF0000].[/color]UrlPath    [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]5[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                      tRet[color=#FF0000].[/color]ExtraInfo  [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]6[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                  [color=#0000FF][b]end[/b][/color]
              
                  MemoryEx[color=#FF0000].[/color]Free(pwszUrl); [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] 6 [color=#0000FF][b]do[/b][/color] MemoryEx[color=#FF0000].[/color]Free(tBuffers[color=#FF0000][[/color]i[color=#FF0000]][/color]); [color=#0000FF][b]end[/b][/color] tURL_COMPONENTS[color=#FF0000]:[/color]Free();
              
                 [color=#0000FF][b]return[/b][/color] (Table[color=#FF0000].[/color]Count(tRet) [color=#FF0000]>[/color] 0) [color=#0000FF][b]and[/b][/color] tRet [color=#0000FF][b]or[/b][/color] [color=#0000FF][b]nil[/b][/color];
              [color=#0000FF][b]end[/b][/color]
              
              [color=#008000][i]-- Test[/i][/color]
              [color=#0000FF][b]local[/b][/color] t*****Url [color=#FF0000]=[/color] *****Url([color=#800080]"http://www.indigorose.com/forums/threads/35330-WinHttp*****Url-function?p=189741#post189741"[/color]);
              Dialog[color=#FF0000].[/color]Message([color=#800080]""[/color][color=#FF0000],[/color] t*****Url[color=#FF0000].[/color]SchemeName[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]Scheme[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]HostName[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]Port[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]UserName[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]Password[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]UrlPath[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]'\r\n'[/color][color=#FF0000].[/color][color=#FF0000].[/color] t*****Url[color=#FF0000].[/color]ExtraInfo[color=#FF0000],[/color] MB_OK[color=#FF0000],[/color] MB_ICONINFORMATION[color=#FF0000],[/color] MB_DEFBUTTON1);[/size][/font]

              Comment


              • #8
                Originally posted by slota View Post
                Buffers must be pre allocated, in them will be recorded the memory address that stores a string of corresponding element. If the buffers are not allocated, then obtain the address value to 0.
                I thought you were defining buffers for the dll call function for the structure returns as thats how your code appeared to be at 4 in the morning :lol

                Comment


                • #9
                  I still prefer the lua socket parse function: http://w3.impa.br/~diego/software/lu...url.html#parse

                  Comment


                  • #10
                    Yes, its easier to use, but I better use all the same something of their own, native.. :lol And I'm going to enable this function in the WinHttp.lh module.

                    Comment


                    • #11
                      Nice work! One more tip;

                      Do not define a structure inside a function call, however define it only once in the scope above. This prevents that MemoryEx has to calculate the offsets and sizes of structure fields each time you call the function.

                      Also, nPort in URL_COMPONENTS is a word value (unsigned short), not an int. You could use an extra alignment word to align it properly. It works either way, but this is how it should be defined.

                      Code:
                      ir_CheckNumArgs = function (tArgs, nArgs) if (#tArgs < nArgs) then error(nArgs .. " arguments expected, "..#tArgs.." arguments passed.", 2); end end
                      
                      ir_CheckTypeArgs = function (tArgs, nArg, tTypes)
                          for i = 1, #tTypes do if (type(tArgs[nArg]) == tTypes[i]) then return tArgs[nArg]; end end
                          error("Bad argument #" .. nArg .. ", must be a "..((#tTypes > 1) and Table.Concat(tTypes, ' or ') or tTypes[1])..", you passed a "..type(tArgs[nArg])..".", 2);
                      end
                      
                      UCODE = function (sString)
                          local pBuf = MemoryEx.Allocate(2 * (#sString + 1));
                          MemoryEx.String(pBuf, -1, MEMEX_UNICODE, sString);
                      
                          return pBuf;
                      end
                      
                      ICU_ESCAPE = 0x80000000;
                      
                      _WinHttp  = Library.Load('winhttp.dll');
                      _Kernel32 = Library.Load('kernel32.dll', false);
                      
                      local URL_COMPONENTS = MemoryEx.DefineStruct{
                          DWORD('StructSize');
                          UINT ('SchemeName');
                          DWORD('SchemeNameLength');
                          INT  ('Scheme');
                          UINT ('HostName');
                          DWORD('HostNameLength');
                          WORD ('Port');
                          WORD ('Alignment_1');
                          UINT ('UserName');
                          DWORD('UserNameLength');
                          UINT ('Password');
                          DWORD('PasswordLength');
                          UINT ('UrlPath');
                          DWORD('UrlPathLength');
                          UINT ('ExtraInfo');
                          DWORD('ExtraInfoLength')
                      };
                      
                      --[[]]----------------------------------------------------------------------------------
                      *****Url = function (...)
                          ir_CheckNumArgs(arg, 1);
                          local sURL  = ir_CheckTypeArgs(arg, 1, {'string'});
                          local nFlag = ir_CheckTypeArgs(arg, 2, {'nil', 'number'});
                          nFlag       = nFlag or ICU_ESCAPE;
                      
                          local pwszUrl = UCODE(sURL);
                          local nURLLen = sURL:len();
                          local tBuffers = {}; for i = 1, 6 do tBuffers[i] = MemoryEx.Allocate(nURLLen + 1); end
                      
                          local tURL_COMPONENTS = URL_COMPONENTS:New();
                          tURL_COMPONENTS.StructSize       = MemoryEx.StructSize(URL_COMPONENTS);
                          tURL_COMPONENTS.SchemeNameLength = nURLLen;
                          tURL_COMPONENTS.SchemeName       = tBuffers[1];
                          tURL_COMPONENTS.HostNameLength   = nURLLen;
                          tURL_COMPONENTS.HostName         = tBuffers[2];
                          tURL_COMPONENTS.UserNameLength   = nURLLen;
                          tURL_COMPONENTS.UserName         = tBuffers[3];
                          tURL_COMPONENTS.PasswordLength   = nURLLen;
                          tURL_COMPONENTS.Password         = tBuffers[4];
                          tURL_COMPONENTS.UrlPathLength    = nURLLen;
                          tURL_COMPONENTS.UrlPath          = tBuffers[5];
                          tURL_COMPONENTS.ExtraInfoLength  = nURLLen;
                          tURL_COMPONENTS.ExtraInfo        = tBuffers[6];
                      
                          local tRet = {};
                          local nRet = _WinHttp.WinHttp*****Url(pwszUrl, nURLLen, ICU_ESCAPE, tURL_COMPONENTS:GetPointer());
                          if (nRet ~= 0) then
                              tRet.SchemeName = MemoryEx.String(tBuffers[1], -1, MEMEX_UNICODE);
                              tRet.Scheme     = tURL_COMPONENTS.Scheme;
                              tRet.HostName   = MemoryEx.String(tBuffers[2], -1, MEMEX_UNICODE);
                              tRet.Port       = tURL_COMPONENTS.Port;
                              tRet.UserName   = MemoryEx.String(tBuffers[3], -1, MEMEX_UNICODE);
                              tRet.Password   = MemoryEx.String(tBuffers[4], -1, MEMEX_UNICODE);
                              tRet.UrlPath    = MemoryEx.String(tBuffers[5], -1, MEMEX_UNICODE);
                              tRet.ExtraInfo  = MemoryEx.String(tBuffers[6], -1, MEMEX_UNICODE);
                          end
                      
                          MemoryEx.Free(pwszUrl); for i = 1, 6 do MemoryEx.Free(tBuffers[i]); end tURL_COMPONENTS:Free();
                      
                         return (Table.Count(tRet) > 0) and tRet or nil;
                      end
                      
                      -- Test
                      local t*****Url = *****Url("http://www.indigorose.com/forums/threads/35330-WinHttp*****Url-function?p=189741#post189741");
                      Dialog.Message("", t*****Url.SchemeName..'\r\n'.. t*****Url.Scheme..'\r\n'.. t*****Url.HostName..'\r\n'.. t*****Url.Port..'\r\n'.. t*****Url.UserName..'\r\n'.. t*****Url.Password..'\r\n'.. t*****Url.UrlPath..'\r\n'.. t*****Url.ExtraInfo, MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
                      Bas Groothedde
                      Imagine Programming :: Blog

                      AMS8 Plugins
                      IMXLH Compiler

                      Comment


                      • #12
                        Thanks for the tip! How did you know that it is necessary to align the structure? At first I also set the type of the nPort equal a WORD value. But I did not know about the need to align. I have not found on MSDN right information about it. And most of the examples I have observed that isolated nPort also 4 bytes. May prompt you where to look correct definition of the structure fields with the information required alignments? Thx.

                        Comment


                        • #13
                          Found another bug. The buffers allocated for the parts link, should be increase in 2 times, or on some links get a crash project.
                          The new version:
                          Code:
                          [font=Courier New][size=2]ir_CheckNumArgs [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (tArgs[color=#FF0000],[/color] nArgs) [color=#0000FF][b]if[/b][/color] ([color=#FF0000]#[/color]tArgs [color=#FF0000]<[/color] nArgs) [color=#0000FF][b]then[/b][/color] error(nArgs [color=#FF0000].[/color][color=#FF0000].[/color] [color=#800080]" arguments expected, "[/color][color=#FF0000].[/color][color=#FF0000].[/color][color=#FF0000]#[/color]tArgs[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]" arguments passed."[/color][color=#FF0000],[/color] 2); [color=#0000FF][b]end[/b][/color] [color=#0000FF][b]end[/b][/color]
                          
                          ir_CheckTypeArgs [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (tArgs[color=#FF0000],[/color] nArg[color=#FF0000],[/color] tTypes)
                              [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] [color=#FF0000]#[/color]tTypes [color=#0000FF][b]do[/b][/color] [color=#0000FF][b]if[/b][/color] (type(tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color]) [color=#FF0000]=[/color][color=#FF0000]=[/color] tTypes[color=#FF0000][[/color]i[color=#FF0000]][/color]) [color=#0000FF][b]then[/b][/color] [color=#0000FF][b]return[/b][/color] tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color]; [color=#0000FF][b]end[/b][/color] [color=#0000FF][b]end[/b][/color]
                              error([color=#800080]"Bad argument #"[/color] [color=#FF0000].[/color][color=#FF0000].[/color] nArg [color=#FF0000].[/color][color=#FF0000].[/color] [color=#800080]", must be a "[/color][color=#FF0000].[/color][color=#FF0000].[/color](([color=#FF0000]#[/color]tTypes [color=#FF0000]>[/color] 1) [color=#0000FF][b]and[/b][/color] Table[color=#FF0000].[/color]Concat(tTypes[color=#FF0000],[/color] [color=#800080]' or '[/color]) [color=#0000FF][b]or[/b][/color] tTypes[color=#FF0000][[/color]1[color=#FF0000]][/color])[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]", you passed a "[/color][color=#FF0000].[/color][color=#FF0000].[/color]type(tArgs[color=#FF0000][[/color]nArg[color=#FF0000]][/color])[color=#FF0000].[/color][color=#FF0000].[/color][color=#800080]"."[/color][color=#FF0000],[/color] 2);
                          [color=#0000FF][b]end[/b][/color]
                          
                          UCODE [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] (sString)
                              [color=#0000FF][b]local[/b][/color] pBuf [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]Allocate(2 [color=#FF0000]*[/color] ([color=#FF0000]#[/color]sString [color=#FF0000]+[/color] 1));
                              MemoryEx[color=#FF0000].[/color]String(pBuf[color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE[color=#FF0000],[/color] sString);
                          
                              [color=#0000FF][b]return[/b][/color] pBuf;
                          [color=#0000FF][b]end[/b][/color]
                          
                          ICU_ESCAPE [color=#FF0000]=[/color] 0x80000000;
                          
                          _WinHttp  [color=#FF0000]=[/color] Library[color=#FF0000].[/color]Load([color=#800080]'winhttp.dll'[/color]);
                          
                          [color=#0000FF][b]local[/b][/color] URL_COMPONENTS [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]DefineStruct[color=#FF0000]{[/color]
                              DWORD([color=#800080]'StructSize'[/color]);
                              UINT ([color=#800080]'SchemeName'[/color]);
                              DWORD([color=#800080]'SchemeNameLength'[/color]);
                              INT  ([color=#800080]'Scheme'[/color]);
                              UINT ([color=#800080]'HostName'[/color]);
                              DWORD([color=#800080]'HostNameLength'[/color]);
                              WORD ([color=#800080]'Port'[/color]);
                              WORD ([color=#800080]'Alignment_1'[/color]);
                              UINT ([color=#800080]'UserName'[/color]);
                              DWORD([color=#800080]'UserNameLength'[/color]);
                              UINT ([color=#800080]'Password'[/color]);
                              DWORD([color=#800080]'PasswordLength'[/color]);
                              UINT ([color=#800080]'UrlPath'[/color]);
                              DWORD([color=#800080]'UrlPathLength'[/color]);
                              UINT ([color=#800080]'ExtraInfo'[/color]);
                              DWORD([color=#800080]'ExtraInfoLength'[/color])
                          [color=#FF0000]}[/color];
                          
                          [color=#008000][i]--[[]][/i][/color][color=#008000][i]----------------------------------------------------------------------------------[/i][/color]
                          *****Url [color=#FF0000]=[/color] [color=#0000FF][b]function[/b][/color] ([color=#FF0000].[/color][color=#FF0000].[/color][color=#FF0000].[/color])
                              ir_CheckNumArgs(arg[color=#FF0000],[/color] 1);
                              [color=#0000FF][b]local[/b][/color] sURL  [color=#FF0000]=[/color] ir_CheckTypeArgs(arg[color=#FF0000],[/color] 1[color=#FF0000],[/color] [color=#FF0000]{[/color][color=#800080]'string'[/color][color=#FF0000]}[/color]);
                              [color=#0000FF][b]local[/b][/color] nFlag [color=#FF0000]=[/color] ir_CheckTypeArgs(arg[color=#FF0000],[/color] 2[color=#FF0000],[/color] [color=#FF0000]{[/color][color=#800080]'nil'[/color][color=#FF0000],[/color] [color=#800080]'number'[/color][color=#FF0000]}[/color]);
                              nFlag       [color=#FF0000]=[/color] nFlag [color=#0000FF][b]or[/b][/color] ICU_ESCAPE;
                          
                              [color=#0000FF][b]local[/b][/color] pwszUrl [color=#FF0000]=[/color] UCODE(sURL);
                              [color=#0000FF][b]local[/b][/color] nURLLen [color=#FF0000]=[/color] sURL[color=#FF0000]:[/color]len();
                              [color=#0000FF][b]local[/b][/color] tBuffers [color=#FF0000]=[/color] [color=#FF0000]{[/color][color=#FF0000]}[/color]; [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] 6 [color=#0000FF][b]do[/b][/color] tBuffers[color=#FF0000][[/color]i[color=#FF0000]][/color] [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]Allocate(2 [color=#FF0000]*[/color] (nURLLen [color=#FF0000]+[/color] 1)); [color=#0000FF][b]end[/b][/color]
                          
                              [color=#0000FF][b]local[/b][/color] tURL_COMPONENTS [color=#FF0000]=[/color] URL_COMPONENTS[color=#FF0000]:[/color]New();
                              tURL_COMPONENTS[color=#FF0000].[/color]StructSize       [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]StructSize(URL_COMPONENTS);
                              tURL_COMPONENTS[color=#FF0000].[/color]SchemeNameLength [color=#FF0000]=[/color] nURLLen;
                              tURL_COMPONENTS[color=#FF0000].[/color]SchemeName       [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]1[color=#FF0000]][/color];
                              tURL_COMPONENTS[color=#FF0000].[/color]HostNameLength   [color=#FF0000]=[/color] nURLLen;
                              tURL_COMPONENTS[color=#FF0000].[/color]HostName         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]2[color=#FF0000]][/color];
                              tURL_COMPONENTS[color=#FF0000].[/color]UserNameLength   [color=#FF0000]=[/color] nURLLen;
                              tURL_COMPONENTS[color=#FF0000].[/color]UserName         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]3[color=#FF0000]][/color];
                              tURL_COMPONENTS[color=#FF0000].[/color]PasswordLength   [color=#FF0000]=[/color] nURLLen;
                              tURL_COMPONENTS[color=#FF0000].[/color]Password         [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]4[color=#FF0000]][/color];
                              tURL_COMPONENTS[color=#FF0000].[/color]UrlPathLength    [color=#FF0000]=[/color] nURLLen;
                              tURL_COMPONENTS[color=#FF0000].[/color]UrlPath          [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]5[color=#FF0000]][/color];
                              tURL_COMPONENTS[color=#FF0000].[/color]ExtraInfoLength  [color=#FF0000]=[/color] nURLLen;
                              tURL_COMPONENTS[color=#FF0000].[/color]ExtraInfo        [color=#FF0000]=[/color] tBuffers[color=#FF0000][[/color]6[color=#FF0000]][/color];
                          
                              [color=#0000FF][b]local[/b][/color] tRet [color=#FF0000]=[/color] [color=#FF0000]{[/color][color=#FF0000]}[/color];
                              [color=#0000FF][b]local[/b][/color] nRet [color=#FF0000]=[/color] _WinHttp[color=#FF0000].[/color]WinHttp*****Url(pwszUrl[color=#FF0000],[/color] nURLLen[color=#FF0000],[/color] ICU_ESCAPE[color=#FF0000],[/color] tURL_COMPONENTS[color=#FF0000]:[/color]GetPointer());
                              [color=#0000FF][b]if[/b][/color] (nRet [color=#FF0000]~[/color][color=#FF0000]=[/color] 0) [color=#0000FF][b]then[/b][/color]
                                  tRet[color=#FF0000].[/color]SchemeName [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]1[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                                  tRet[color=#FF0000].[/color]Scheme     [color=#FF0000]=[/color] tURL_COMPONENTS[color=#FF0000].[/color]Scheme;
                                  tRet[color=#FF0000].[/color]HostName   [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]2[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                                  tRet[color=#FF0000].[/color]Port       [color=#FF0000]=[/color] tURL_COMPONENTS[color=#FF0000].[/color]Port;
                                  tRet[color=#FF0000].[/color]UserName   [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]3[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                                  tRet[color=#FF0000].[/color]Password   [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]4[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                                  tRet[color=#FF0000].[/color]UrlPath    [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]5[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                                  tRet[color=#FF0000].[/color]ExtraInfo  [color=#FF0000]=[/color] MemoryEx[color=#FF0000].[/color]String(tBuffers[color=#FF0000][[/color]6[color=#FF0000]][/color][color=#FF0000],[/color] [color=#FF0000]-[/color]1[color=#FF0000],[/color] MEMEX_UNICODE);
                              [color=#0000FF][b]end[/b][/color]
                          
                              MemoryEx[color=#FF0000].[/color]Free(pwszUrl); [color=#0000FF][b]for[/b][/color] i [color=#FF0000]=[/color] 1[color=#FF0000],[/color] 6 [color=#0000FF][b]do[/b][/color] MemoryEx[color=#FF0000].[/color]Free(tBuffers[color=#FF0000][[/color]i[color=#FF0000]][/color]); [color=#0000FF][b]end[/b][/color] tURL_COMPONENTS[color=#FF0000]:[/color]Free();
                          
                             [color=#0000FF][b]return[/b][/color] (Table[color=#FF0000].[/color]Count(tRet) [color=#FF0000]>[/color] 0) [color=#0000FF][b]and[/b][/color] tRet [color=#0000FF][b]or[/b][/color] [color=#0000FF][b]nil[/b][/color];
                          [color=#0000FF][b]end[/b][/color][/size][/font]

                          Comment


                          • #14
                            Unicode buffers are *4 of ASCII

                            Comment


                            • #15
                              Originally posted by Shrek View Post
                              Unicode buffers are *4 of ASCII
                              2 bytes for each character, why * 4?
                              Bas Groothedde
                              Imagine Programming :: Blog

                              AMS8 Plugins
                              IMXLH Compiler

                              Comment

                              Working...
                              X