Čitanje INTERNET_OPTION_PROXY u WinINet sa C# baferom određene veličine
Preuzmite INTERNET_OPTION_PROXY upitom za veličinu i pravilno dimenzionisanim izvornim baferom, u skladu sa poljima DWORD i pokazivača u C#.
INTERNET_PROXY_INFO sadrži DWORD tip pristupa i dva pokazivača na stringove. Izvorni upit takođe zahteva dovoljno bafer prostora za svoje proxy podatke; Marshal.SizeOf male upravljane strukture nije potpun bafer rezultata promenljive dužine.
Pomoćnik za kompatibilnost radne površine može koristiti ANSI ulaznu tačku i kopirati stringove pre oslobađanja tog bafera upita:
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 je INTERNET_OPTION_PROXY; 122 je ERROR_INSUFFICIENT_BUFFER. Prvi poziv dobija potreban broj bajtova, a drugi popunjava tu alokaciju. Ako rezultat naraste između poziva, prijavljuje se drugi neuspeh umesto čitanja premalog bafera.
Zadržite AccessType kao uint. U 64-bitnom procesu ostaje 32-bitni DWORD, dok se polja pokazivača šire sa arhitekturom procesa. Normalan sekvencijalni raspored daje odgovarajuće poravnanje.
Ovaj primer se odnosi na bafer rezultata opcije 38. Ne primenjujte njegov obrazac vlasništva slepo na INTERNET_OPTION_PER_CONNECTION_OPTION, čije vraćene string opcije zahtevaju dokumentovano odvojeno čišćenje.
Rezultat opisuje WinINet konfiguraciju u izabranom obuhvatu ručke. To nije PAC odluka za proizvoljni URL niti izveštaj o stvarnoj ruti svakog pregledača. Kada je vraćeni proxy string mapa specifična za protokol, sačuvajte tu strukturu umesto da je tretirate kao jednu krajnju tačku. WinINet je desktop API; servisne aplikacije trebaju svoj podržani WinHTTP raspored.