Akhri INTERNET_OPTION_PROXY ee WinINet oo leh buffer C# cabbir leh
Soo qaado INTERNET_OPTION_PROXY iyada oo la isticmaalayo weydiin cabbir iyo buffer asli ah oo si sax ah loo cabbiray, oo u dhigma beeraha DWORD iyo tilmaame ee C#.
INTERNET_PROXY_INFO waxa uu ka kooban yahay nooc gelitaan DWORD iyo laba tilmaame oo xaraf ah. Weydiinta asliga ah waxa kale oo ay u baahan tahay boos buffer ku filan xogta proxy; Marshal.SizeOf ee qaab-dhismeed yar oo la maareeyo ma aha buffer natiijo buuxda oo dhererkiisu beddelmo.
Kaaliyaha iswaafajinta desktop waxa uu isticmaali karaa barta gelitaanka ANSI oo uu koobiyaa xarfaha ka hor inta aan la sii dayn buffer-ka weydiinta:
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 waa INTERNET_OPTION_PROXY; 122 waa ERROR_INSUFFICIENT_BUFFER. Wicitaanka koowaad waxa uu helaa tirada bytes ee loo baahan yahay, kan labaadna waxa uu buuxiyaa qoondayntaas. Haddii natiijadu u kordho inta u dhaxaysa wicitaannada, fashilka labaad ayaa la soo sheegaa halkii la akhrin lahaa buffer aad u yar.
Ku hay AccessType sida uint. Habka 64-bit waxa uu ahaanayaa DWORD 32-bit ah, halka beeraha tilmaamuhu ay la ballaadhaan qaab-dhismeedka habka. Qaabka isku xigxiga caadiga ah waxa uu bixiyaa iswaafajinta ku habboon.
Tusaalahani waxa uu ku saabsan yahay buffer-ka natiijada ikhtiyaarka 38. Ha ku dabaqin qaabka lahaanshihiisa si indho la'aan ah INTERNET_OPTION_PER_CONNECTION_OPTION, kaas oo ikhtiyaarradiisa xaraf ee la soo celiyo ay u baahan yihiin nadiifin gooni ah oo diiwaan gashan.
Natiijadu waxa ay sharraxaysaa habaynta WinINet ee xadka gacanta la doortay. Ma aha go'aan PAC oo loogu talagalay URL aan loo baahnayn ama warbixin ku saabsan waddada dhabta ah ee browser kasta. Marka xarafka proxy ee la soo celiyo uu yahay khariidad gaar u ah borotokoolka, ilaali qaab-dhismeedkaas halkii aad u tixgelin lahayd hal barta dhammaad. WinINet waa API-ga desktop-ka; codsiyada adeeggu waxa ay u baahan yihiin habaynta WinHTTP ee la taageeray.