อ่าน INTERNET_OPTION_PROXY ใน WinINet ด้วยบัฟเฟอร์ C# ที่กำหนดขนาด
ดึง INTERNET_OPTION_PROXY ด้วยการสอบถามขนาดและบัฟเฟอร์เนทีฟที่กำหนดขนาดอย่างถูกต้อง ตรงกับฟิลด์ DWORD และพอยน์เตอร์ใน C#
INTERNET_PROXY_INFO มีชนิดการเข้าถึง DWORD และพอยน์เตอร์สตริงสองตัว การสอบถามแบบเนทีฟยังต้องใช้พื้นที่บัฟเฟอร์เพียงพอสำหรับข้อมูลพร็อกซีของตน Marshal.SizeOf ของโครงสร้างที่มีการจัดการขนาดเล็กไม่ใช่บัฟเฟอร์ผลลัพธ์แบบความยาวแปรผันที่สมบูรณ์
ตัวช่วยความเข้ากันได้บนเดสก์ท็อปสามารถใช้จุดเข้าถึง ANSI และคัดลอกสตริงก่อนปล่อยบัฟเฟอร์การสอบถามนั้น:
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; 122 คือ ERROR_INSUFFICIENT_BUFFER การเรียกครั้งแรกได้จำนวนไบต์ที่ต้องการ และครั้งที่สองเติมการจัดสรรนั้น หากผลลัพธ์เพิ่มขึ้นระหว่างการเรียก จะรายงานความล้มเหลวครั้งที่สองแทนการอ่านบัฟเฟอร์ที่เล็กเกินไป
เก็บ AccessType เป็น uint ในโปรเซส 64 บิตยังคงเป็น DWORD 32 บิต ขณะที่ฟิลด์พอยน์เตอร์ขยายตามสถาปัตยกรรมของโปรเซส เลย์เอาต์แบบลำดับปกติให้การจัดตำแหน่งที่สอดคล้องกัน
ตัวอย่างนี้เกี่ยวกับบัฟเฟอร์ผลลัพธ์ของตัวเลือก 38 อย่านำรูปแบบความเป็นเจ้าของไปใช้กับ INTERNET_OPTION_PER_CONNECTION_OPTION อย่างไม่ลืมหูลืมตา ซึ่งตัวเลือกสตริงที่ส่งคืนต้องมีการล้างแยกต่างหากตามเอกสาร
ผลลัพธ์อธิบายการกำหนดค่า WinINet ในขอบเขตแฮนเดิลที่เลือก ไม่ใช่การตัดสินใจ PAC สำหรับ URL ใด ๆ หรือรายงานเส้นทางจริงของทุกเบราว์เซอร์ เมื่อสตริงพร็อกซีที่ส่งคืนเป็นแผนที่เฉพาะโปรโตคอล ให้รักษาโครงสร้างนั้นแทนที่จะถือเป็นจุดปลายทางเดียว WinINet คือ API บนเดสก์ท็อป แอปพลิเคชันบริการต้องมีการจัดวาง WinHTTP ที่รองรับ