Soma INTERNET_OPTION_PROXY ya WinINet kwa buffer ya C# yenye ukubwa
Pata INTERNET_OPTION_PROXY kwa hoja ya ukubwa na buffer asilia yenye ukubwa sahihi, ikilingana na sehemu za DWORD na kielekezi katika C#.
INTERNET_PROXY_INFO ina aina ya ufikiaji DWORD na vielekezi viwili vya mfuatano. Hoja asilia pia inahitaji nafasi ya kutosha ya buffer kwa data yake ya proksi; Marshal.SizeOf ya muundo mdogo unaosimamiwa si buffer kamili ya matokeo yenye urefu unaobadilika.
Kisaidizi cha upatanishi wa desktop kinaweza kutumia kiingilio cha ANSI na kunakili mifuatano kabla ya kuachilia buffer hiyo ya hoja:
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 ni INTERNET_OPTION_PROXY; 122 ni ERROR_INSUFFICIENT_BUFFER. Wito wa kwanza hupata idadi inayohitajika ya baiti, na wa pili hujaza mgao huo. Ikiwa matokeo yatakua kati ya wito, kushindwa kwa pili huripotiwa badala ya kusoma buffer ndogo mno.
Weka AccessType kama uint. Katika mchakato wa 64-bit inabaki DWORD ya 32-bit, wakati sehemu za kielekezi zinapanuka pamoja na usanifu wa mchakato. Mpangilio wa kawaida wa mfuatano hutoa upatanishaji unaolingana.
Mfano huu unahusu buffer ya matokeo ya chaguo 38. Usitumie muundo wake wa umiliki kwa upofu kwenye INTERNET_OPTION_PER_CONNECTION_OPTION, ambayo chaguo zake za mfuatano zinazorudishwa zinahitaji usafishaji wake tofauti ulioandikwa.
Matokeo yanaelezea usanidi wa WinINet katika wigo wa kishikio kilichochaguliwa. Si uamuzi wa PAC kwa URL yoyote au ripoti ya njia halisi ya kila kivinjari. Wakati mfuatano wa proksi unaorudishwa ni ramani maalum ya itifaki, hifadhi muundo huo badala ya kuuchukua kama sehemu moja ya mwisho. WinINet ni API ya desktop; programu za huduma zinahitaji mpangilio wao wa WinHTTP unaoungwa mkono.