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.
Announcement
Collapse
No announcement yet.
WinHttp*****Url function
Collapse
X
-
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
-
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)
Comment
-
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
-
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.
Comment
-
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
-
Originally posted by slota View PostBuffers 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
-
I still prefer the lua socket parse function: http://w3.impa.br/~diego/software/lu...url.html#parse
Comment
-
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);
Comment
-
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
-
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
-
Originally posted by Shrek View PostUnicode buffers are *4 of ASCII
Comment
Comment