WinINet INTERNET_OPTION_PROXY lugemine mõõdetud C# puhvriga
Hankige INTERNET_OPTION_PROXY suuruse päringu ja õigesti mõõdetud natiivse puhvriga, vastates C# DWORD- ja osutiväljadele.
INTERNET_PROXY_INFO sisaldab DWORD-tüüpi juurdepääsu ja kahte stringiosutit. Natiivne päring vajab ka piisavalt puhvriruumi oma puhverserveri andmete jaoks; väikese haldatud struktuuri Marshal.SizeOf ei ole täielik muutuva pikkusega tulemuspuhver.
Töölaua ühilduvusabivahend saab kasutada ANSI-sisendpunkti ja kopeerida stringid enne selle päringupuhvri vabastamist:
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 on INTERNET_OPTION_PROXY; 122 on ERROR_INSUFFICIENT_BUFFER. Esimene kutse hangib vajaliku baitide arvu ja teine täidab selle eraldise. Kui tulemus kutsete vahel kasvab, teatatakse teisest ebaõnnestumisest, selle asemel et lugeda liiga väikest puhvrit.
Hoidke AccessType tüübiga uint. 64-bitises protsessis jääb see 32-bitiseks DWORD-iks, samal ajal kui osutiväljad laienevad koos protsessi arhitektuuriga. Tavaline järjestikune paigutus annab vastava joonduse.
See näide käsitleb valiku 38 tulemuspuhvrit. Ärge rakendage selle omandimustrit pimesi INTERNET_OPTION_PER_CONNECTION_OPTIONile, mille tagastatud stringivalikud nõuavad dokumenteeritud eraldi puhastamist.
Tulemus kirjeldab WinINeti konfiguratsiooni valitud käepideme ulatuses. See ei ole PAC-otsus suvalise URL-i jaoks ega aruanne iga brauseri tegeliku marsruudi kohta. Kui tagastatud puhverserveri string on protokollipõhine kaart, säilitage see struktuur, selle asemel et käsitleda seda ühe lõpp-punktina. WinINet on töölaua API; teenuserakendused vajavad oma toetatud WinHTTP-korraldust.