WinINet INTERNET_OPTION_PROXY'yi boyutlandırılmış C# tamponuyla okuma
INTERNET_OPTION_PROXY'yi boyut sorgusu ve doğru boyutlandırılmış yerel tamponla alın; C# içindeki DWORD ve işaretçi alanlarıyla eşleştirin.
INTERNET_PROXY_INFO bir DWORD erişim türü ve iki dize işaretçisi içerir. Yerel sorgu ayrıca proxy verisi için yeterli tampon alanına ihtiyaç duyar; küçük bir yönetilen yapının Marshal.SizeOf değeri tam değişken uzunluklu sonuç tamponu değildir.
Bir masaüstü uyumluluk yardımcısı ANSI giriş noktasını kullanabilir ve dizeleri o sorgu tamponu serbest bırakılmadan önce kopyalayabilir:
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'dır. İlk çağrı gereken bayt sayısını alır, ikincisi bu ayırmayı doldurur. Sonuç çağrılar arasında büyürse, çok küçük bir tampon okumak yerine ikinci hata bildirilir.
AccessType'ı uint olarak tutun. 64 bitlik bir süreçte 32 bitlik DWORD olarak kalır; işaretçi alanları sürecin mimarisiyle genişler. Normal sıralı düzen karşılık gelen hizalamayı sağlar.
Bu örnek 38 seçeneğinin sonuç tamponuyla ilgilidir. Sahiplik desenini INTERNET_OPTION_PER_CONNECTION_OPTION'a körü körüne uygulamayın; döndürülen dize seçenekleri belgelenmiş ayrı temizlik gerektirir.
Sonuç, seçilen tanıtıcı kapsamındaki WinINet yapılandırmasını açıklar. Rastgele bir URL için PAC kararı veya her tarayıcının gerçek yolu hakkında bir rapor değildir. Döndürülen proxy dizesi protokole özgü bir eşleme ise, onu tek bir uç nokta olarak ele almak yerine bu yapıyı koruyun. WinINet masaüstü API'sidir; hizmet uygulamaları desteklenen WinHTTP düzenlemelerine ihtiyaç duyar.