WinINet INTERNET_OPTION_PROXY irakurtzea C# buffer tamainadunarekin
Eskuratu INTERNET_OPTION_PROXY tamaina-kontsulta eta ondo neurtutako buffer natiboarekin, C#-ko DWORD eta erakusle eremuekin bat etorriz.
INTERNET_PROXY_INFO-k DWORD sarbide-mota eta bi kate-erakusle ditu. Kontsulta natiboak proxy datuetarako buffer-leku nahikoa behar du; kudeatutako egitura txiki baten Marshal.SizeOf ez da luzera aldakorreko emaitza-buffer osoa.
Mahaigaineko bateragarritasun-laguntzaile batek ANSI sarrera-puntua erabil dezake eta kateak kopiatu kontsulta-buffer hori askatu aurretik:
static class WinInetProxy
{
[System.Runtime.InteropServices.StructLayout(
System.Runtime.InteropServices.LayoutKind.Sequential)]
struct ProxyInfo
{
public uint AccessType;
public IntPtr Proxy;
public IntPtr Bypass;
}
[System.Runtime.InteropServices.DllImport(
"wininet.dll", EntryPoint = "InternetQueryOptionA",
SetLastError = true)]
[return: System.Runtime.InteropServices.MarshalAs(
System.Runtime.InteropServices.UnmanagedType.Bool)]
static extern bool Query(
IntPtr handle, uint option, IntPtr buffer, ref uint size);
public static (uint Type, string Proxy, string Bypass) Read()
{
uint size = 0;
Query(IntPtr.Zero, 38, IntPtr.Zero, ref size);
int error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
if (error != 122 || size == 0)
throw new System.ComponentModel.Win32Exception(error);
IntPtr buffer = System.Runtime.InteropServices.Marshal
.AllocHGlobal(checked((int)size));
try
{
if (!Query(IntPtr.Zero, 38, buffer, ref size))
throw new System.ComponentModel.Win32Exception(
System.Runtime.InteropServices.Marshal.GetLastWin32Error());
var value = System.Runtime.InteropServices.Marshal
.PtrToStructure<ProxyInfo>(buffer);
return (value.AccessType,
System.Runtime.InteropServices.Marshal.PtrToStringAnsi(value.Proxy) ?? "",
System.Runtime.InteropServices.Marshal.PtrToStringAnsi(value.Bypass) ?? "");
}
finally
{
System.Runtime.InteropServices.Marshal.FreeHGlobal(buffer);
}
}
}
38 INTERNET_OPTION_PROXY da; 122 ERROR_INSUFFICIENT_BUFFER da. Lehen deiak behar den byte-kopurua lortzen du eta bigarrenak esleipen hori betetzen du. Emaitza deien artean handitzen bada, bigarren hutsegitea jakinarazten da buffer txikiegi bat irakurri beharrean.
Mantendu AccessType uint gisa. 64 biteko prozesu batean 32 biteko DWORD izaten jarraitzen du, erakusle-eremuak prozesuaren arkitekturarekin zabaltzen diren bitartean. Ohiko sekuentzia-diseinuak dagokion lerrokatzea ematen du.
Adibide hau 38 aukeraren emaitza-bufferari buruzkoa da. Ez aplikatu haren jabetza-eredua itsu-itsuan INTERNET_OPTION_PER_CONNECTION_OPTIONi, haren itzulitako kate-aukerek dokumentatutako garbiketa bereizia behar dutelako.
Emaitzak WinINet konfigurazioa deskribatzen du hautatutako helduleku-eremuan. Ez da PAC erabakia URL arbitrario baterako, ezta nabigatzaile bakoitzaren benetako ibilbidearen txostena ere. Itzulitako proxy katea protokoloaren araberako mapa bada, gorde egitura hori puntu bakar gisa tratatu beharrean. WinINet mahaigaineko APIa da; zerbitzu-aplikazioek beren WinHTTP antolaketa onartua behar dute.