Basahin ang INTERNET_OPTION_PROXY sa WinINet gamit ang sukat na C# buffer
Kunin ang INTERNET_OPTION_PROXY gamit ang sukat na query at wastong sinukat na native buffer, tugma sa DWORD at pointer field sa C#.
Ang INTERNET_PROXY_INFO ay naglalaman ng DWORD access type at dalawang string pointer. Ang native query ay nangangailangan din ng sapat na espasyo ng buffer para sa proxy data nito; ang Marshal.SizeOf ng maliit na managed structure ay hindi kumpletong variable-length na result buffer.
Ang isang desktop compatibility helper ay maaaring gumamit ng ANSI entry point at kopyahin ang mga string bago ilabas ang query buffer na iyon:
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 ay INTERNET_OPTION_PROXY; 122 ay ERROR_INSUFFICIENT_BUFFER. Nakukuha ng unang tawag ang kinakailangang bilang ng byte, at pinupuno ng pangalawa ang allocation na iyon. Kung lumaki ang resulta sa pagitan ng mga tawag, iniuulat ang pangalawang pagkabigo sa halip na magbasa ng masyadong maliit na buffer.
Panatilihin ang AccessType bilang uint. Sa 64-bit na proseso nananatili itong 32-bit na DWORD, habang lumalawak ang pointer field kasama ng arkitektura ng proseso. Ang normal na sequential layout ay nagbibigay ng katumbas na alignment.
Ang halimbawang ito ay tungkol sa result buffer ng option 38. Huwag bulag na ilapat ang pattern ng pagmamay-ari nito sa INTERNET_OPTION_PER_CONNECTION_OPTION, na ang mga ibinalik na string option ay nangangailangan ng kanilang dokumentadong hiwalay na paglilinis.
Inilalarawan ng resulta ang configuration ng WinINet sa napiling saklaw ng handle. Hindi ito desisyon ng PAC para sa arbitrary na URL o ulat ng aktwal na ruta ng bawat browser. Kapag ang ibinalik na proxy string ay isang mapang partikular sa protocol, panatilihin ang istrukturang iyon sa halip na ituring itong isang endpoint. Ang WinINet ay desktop API; ang mga service application ay nangangailangan ng kanilang sinusuportahang WinHTTP setup.