WinINet INTERNET_OPTION_PROXY-ni ölçülü C# buferi ilə oxuyun
INTERNET_OPTION_PROXY-ni ölçü sorğusu və düzgün ölçülmüş yerli buferlə götürün, C#-dakı DWORD və göstərici sahələri ilə uyğunlaşdırın.
INTERNET_PROXY_INFO bir DWORD giriş növü və iki sətir göstəricisi saxlayır. Yerli sorğu həmçinin proksi məlumatı üçün kifayət qədər bufer sahəsi tələb edir; kiçik idarə olunan strukturun Marshal.SizeOf dəyəri tam dəyişən uzunluqlu nəticə buferi deyil.
Masaüstü uyğunluq köməkçisi ANSI giriş nöqtəsindən istifadə edib sətirləri sorğu buferini azad etməzdən əvvəl kopyalaya bilər:
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 INTERNET_OPTION_PROXY-dir; 122 ERROR_INSUFFICIENT_BUFFER-dir. Birinci çağırış tələb olunan bayt sayını alır, ikinci həmin ayrılmış yeri doldurur. Nəticə çağırışlar arasında böyüyərsə, kiçik bufer oxumaq əvəzinə ikinci uğursuzluq bildirilir.
AccessType-ı uint kimi saxlayın. 64 bitlik prosesdə o, 32 bitlik DWORD olaraq qalır, göstərici sahələri isə proses arxitekturası ilə genişlənir. Normal ardıcıl yerləşdirmə uyğun düzlənməni təmin edir.
Bu nümunə 38 variantının nəticə buferinə aiddir. Onun sahiblik modelini INTERNET_OPTION_PER_CONNECTION_OPTION-a kor-koranə tətbiq etməyin; qaytarılan sətir variantları sənədləşdirilmiş ayrıca təmizləmə tələb edir.
Nəticə seçilmiş tutacaq əhatəsində WinINet konfiqurasiyasını təsvir edir. Bu, ixtiyari URL üçün PAC qərarı və ya hər brauzerin faktiki marşrutunun hesabatı deyil. Qaytarılan proksi sətri protokola xas xəritə olarsa, onu bir son nöqtə kimi qəbul etmək əvəzinə həmin strukturu qoruyun. WinINet masaüstü API-dir; xidmət tətbiqləri öz dəstəklənən WinHTTP quruluşuna ehtiyac duyur.