Win32 API 日本語リファレンス
ホームNetworking.WinHttp › WinHttpGetProxyForUrl

WinHttpGetProxyForUrl

関数
指定URLに使用すべきプロキシ情報を取得する。
DLLWINHTTP.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// WINHTTP.dll
#include <windows.h>

BOOL WinHttpGetProxyForUrl(
    void* hSession,
    LPCWSTR lpcwszUrl,
    WINHTTP_AUTOPROXY_OPTIONS* pAutoProxyOptions,
    WINHTTP_PROXY_INFO* pProxyInfo
);

パラメーター

名前方向説明
hSessionvoid*inoutWinHttpOpen 関数が返した WinHTTP セッション ハンドルです。
lpcwszUrlLPCWSTRinアプリケーションが送信しようとしている HTTP 要求の URL を格納する、null 終端された Unicode 文字列へのポインターです。
pAutoProxyOptionsWINHTTP_AUTOPROXY_OPTIONS*inout使用する自動プロキシ オプションを指定する WINHTTP_AUTOPROXY_OPTIONS 構造体へのポインターです。
pProxyInfoWINHTTP_PROXY_INFO*inoutプロキシ設定を受け取る WINHTTP_PROXY_INFO 構造体へのポインターです。この構造体は、WINHTTP_OPTION_PROXY オプションを使用して要求ハンドルに適用されます。この構造体に格納されている lpszProxy 文字列と lpszProxyBypass 文字列は、(NULL でない場合) GlobalFree 関数を使用して解放してください。

戻り値の型: BOOL

公式ドキュメント

指定した URL のプロキシ データを取得します。(WinHttpGetProxyForUrl)

戻り値

関数が成功した場合、TRUE を返します。

関数が失敗した場合は FALSE を返します。拡張エラー情報を取得するには、 GetLastError を呼び出してください。

発生し得るエラー コードは次のとおりです。

エラー コード 説明
ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR
指定した URL に対するプロキシが見つからない場合に WinHttpGetProxyForUrl が返します。
ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT
プロキシ自動構成 (PAC) ファイル内のスクリプト コードの実行中にエラーが発生しました。
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
指定されたハンドルの種類が、この操作には適切ではありません。
ERROR_WINHTTP_INTERNAL_ERROR
内部エラーが発生しました。
ERROR_WINHTTP_INVALID_URL
URL が無効です。
ERROR_WINHTTP_LOGIN_FAILURE
ログインの試行に失敗しました。このエラーが発生した場合は、 WinHttpCloseHandle で要求ハンドルを閉じてください。このエラーを最初に発生させた関数を再試行する前に、新しい要求ハンドルを作成する必要があります。
ERROR_WINHTTP_OPERATION_CANCELLED
操作がキャンセルされました。通常は、操作が完了する前に、その要求が処理に使用していたハンドルが閉じられたことが原因です。
ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT
PAC ファイルをダウンロードできませんでした。たとえば、PAC URL が参照するサーバーに到達できなかった、またはサーバーが 404 NOT FOUND 応答を返したなどが考えられます。
ERROR_WINHTTP_UNRECOGNIZED_SCHEME
PAC ファイルの URL に、"http:" または "https:" 以外のスキームが指定されています。
ERROR_NOT_ENOUGH_MEMORY
要求された操作を完了するのに十分なメモリがありませんでした。(Windows エラー コード)

解説(Remarks)

この関数は、HTTP 要求のプロキシ設定を自動的に構成するための Web プロキシ自動検出 (WPAD) プロトコルを実装します。WPAD プロトコルは、プロキシ自動構成 (PAC) ファイルをダウンロードします。このファイルは、特定のターゲット URL に使用するプロキシ サーバーを識別するスクリプトです。PAC ファイルは通常、企業ネットワーク環境において IT 部門によって配置されます。PAC ファイルの URL は明示的に指定できるほか、WinHttpGetProxyForUrl にローカル ネットワーク上の PAC ファイルの場所を自動的に検出するよう指示することもできます。

WinHttpGetProxyForUrl がサポートするのは、ECMAScript ベースの PAC ファイルのみです。

PAC ファイルは URL ごとに異なるプロキシ サーバーを返すことができるため、WinHttpGetProxyForUrl は URL 単位で呼び出す必要があります。これは、ターゲット URL (lpcwszUrl パラメーターで指定) をプロキシ サーバー配列内の特定のプロキシにマッピング (ハッシュ化) することで、IT 部門が PAC ファイルによってプロキシ サーバーの負荷分散を実装できるため有用です。

pAutoProxyOptions 構造体の dwFlags メンバーで自動検出が指定されている場合、WinHttpGetProxyForUrl は自動プロキシ URL と自動プロキシ スクリプトをキャッシュします。詳細については、Autoproxy Cache を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// WINHTTP.dll
#include <windows.h>

BOOL WinHttpGetProxyForUrl(
    void* hSession,
    LPCWSTR lpcwszUrl,
    WINHTTP_AUTOPROXY_OPTIONS* pAutoProxyOptions,
    WINHTTP_PROXY_INFO* pProxyInfo
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WINHTTP.dll", SetLastError = true, ExactSpelling = true)]
static extern bool WinHttpGetProxyForUrl(
    IntPtr hSession,   // void* in/out
    [MarshalAs(UnmanagedType.LPWStr)] string lpcwszUrl,   // LPCWSTR
    IntPtr pAutoProxyOptions,   // WINHTTP_AUTOPROXY_OPTIONS* in/out
    IntPtr pProxyInfo   // WINHTTP_PROXY_INFO* in/out
);
<DllImport("WINHTTP.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function WinHttpGetProxyForUrl(
    hSession As IntPtr,   ' void* in/out
    <MarshalAs(UnmanagedType.LPWStr)> lpcwszUrl As String,   ' LPCWSTR
    pAutoProxyOptions As IntPtr,   ' WINHTTP_AUTOPROXY_OPTIONS* in/out
    pProxyInfo As IntPtr   ' WINHTTP_PROXY_INFO* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' hSession : void* in/out
' lpcwszUrl : LPCWSTR
' pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out
' pProxyInfo : WINHTTP_PROXY_INFO* in/out
Declare PtrSafe Function WinHttpGetProxyForUrl Lib "winhttp" ( _
    ByVal hSession As LongPtr, _
    ByVal lpcwszUrl As LongPtr, _
    ByVal pAutoProxyOptions As LongPtr, _
    ByVal pProxyInfo As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

WinHttpGetProxyForUrl = ctypes.windll.winhttp.WinHttpGetProxyForUrl
WinHttpGetProxyForUrl.restype = wintypes.BOOL
WinHttpGetProxyForUrl.argtypes = [
    ctypes.POINTER(None),  # hSession : void* in/out
    wintypes.LPCWSTR,  # lpcwszUrl : LPCWSTR
    ctypes.c_void_p,  # pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out
    ctypes.c_void_p,  # pProxyInfo : WINHTTP_PROXY_INFO* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WINHTTP.dll')
WinHttpGetProxyForUrl = Fiddle::Function.new(
  lib['WinHttpGetProxyForUrl'],
  [
    Fiddle::TYPE_VOIDP,  # hSession : void* in/out
    Fiddle::TYPE_VOIDP,  # lpcwszUrl : LPCWSTR
    Fiddle::TYPE_VOIDP,  # pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out
    Fiddle::TYPE_VOIDP,  # pProxyInfo : WINHTTP_PROXY_INFO* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "winhttp")]
extern "system" {
    fn WinHttpGetProxyForUrl(
        hSession: *mut (),  // void* in/out
        lpcwszUrl: *const u16,  // LPCWSTR
        pAutoProxyOptions: *mut WINHTTP_AUTOPROXY_OPTIONS,  // WINHTTP_AUTOPROXY_OPTIONS* in/out
        pProxyInfo: *mut WINHTTP_PROXY_INFO  // WINHTTP_PROXY_INFO* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("WINHTTP.dll", SetLastError = true)]
public static extern bool WinHttpGetProxyForUrl(IntPtr hSession, [MarshalAs(UnmanagedType.LPWStr)] string lpcwszUrl, IntPtr pAutoProxyOptions, IntPtr pProxyInfo);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WINHTTP_WinHttpGetProxyForUrl' -Namespace Win32 -PassThru
# $api::WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
#uselib "WINHTTP.dll"
#func global WinHttpGetProxyForUrl "WinHttpGetProxyForUrl" sptr, sptr, sptr, sptr
; WinHttpGetProxyForUrl hSession, lpcwszUrl, varptr(pAutoProxyOptions), varptr(pProxyInfo)   ; 戻り値は stat
; hSession : void* in/out -> "sptr"
; lpcwszUrl : LPCWSTR -> "sptr"
; pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> "sptr"
; pProxyInfo : WINHTTP_PROXY_INFO* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WINHTTP.dll"
#cfunc global WinHttpGetProxyForUrl "WinHttpGetProxyForUrl" sptr, wstr, var, var
; res = WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
; hSession : void* in/out -> "sptr"
; lpcwszUrl : LPCWSTR -> "wstr"
; pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> "var"
; pProxyInfo : WINHTTP_PROXY_INFO* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL WinHttpGetProxyForUrl(void* hSession, LPCWSTR lpcwszUrl, WINHTTP_AUTOPROXY_OPTIONS* pAutoProxyOptions, WINHTTP_PROXY_INFO* pProxyInfo)
#uselib "WINHTTP.dll"
#cfunc global WinHttpGetProxyForUrl "WinHttpGetProxyForUrl" intptr, wstr, var, var
; res = WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
; hSession : void* in/out -> "intptr"
; lpcwszUrl : LPCWSTR -> "wstr"
; pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> "var"
; pProxyInfo : WINHTTP_PROXY_INFO* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	winhttp = windows.NewLazySystemDLL("WINHTTP.dll")
	procWinHttpGetProxyForUrl = winhttp.NewProc("WinHttpGetProxyForUrl")
)

// hSession (void* in/out), lpcwszUrl (LPCWSTR), pAutoProxyOptions (WINHTTP_AUTOPROXY_OPTIONS* in/out), pProxyInfo (WINHTTP_PROXY_INFO* in/out)
r1, _, err := procWinHttpGetProxyForUrl.Call(
	uintptr(hSession),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpcwszUrl))),
	uintptr(pAutoProxyOptions),
	uintptr(pProxyInfo),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function WinHttpGetProxyForUrl(
  hSession: Pointer;   // void* in/out
  lpcwszUrl: PWideChar;   // LPCWSTR
  pAutoProxyOptions: Pointer;   // WINHTTP_AUTOPROXY_OPTIONS* in/out
  pProxyInfo: Pointer   // WINHTTP_PROXY_INFO* in/out
): BOOL; stdcall;
  external 'WINHTTP.dll' name 'WinHttpGetProxyForUrl';
result := DllCall("WINHTTP\WinHttpGetProxyForUrl"
    , "Ptr", hSession   ; void* in/out
    , "WStr", lpcwszUrl   ; LPCWSTR
    , "Ptr", pAutoProxyOptions   ; WINHTTP_AUTOPROXY_OPTIONS* in/out
    , "Ptr", pProxyInfo   ; WINHTTP_PROXY_INFO* in/out
    , "Int")   ; return: BOOL
●WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo) = DLL("WINHTTP.dll", "bool WinHttpGetProxyForUrl(void*, char*, void*, void*)")
# 呼び出し: WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
# hSession : void* in/out -> "void*"
# lpcwszUrl : LPCWSTR -> "char*"
# pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> "void*"
# pProxyInfo : WINHTTP_PROXY_INFO* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "winhttp" fn WinHttpGetProxyForUrl(
    hSession: ?*anyopaque, // void* in/out
    lpcwszUrl: [*c]const u16, // LPCWSTR
    pAutoProxyOptions: [*c]WINHTTP_AUTOPROXY_OPTIONS, // WINHTTP_AUTOPROXY_OPTIONS* in/out
    pProxyInfo: [*c]WINHTTP_PROXY_INFO // WINHTTP_PROXY_INFO* in/out
) callconv(std.os.windows.WINAPI) i32;
proc WinHttpGetProxyForUrl(
    hSession: pointer,  # void* in/out
    lpcwszUrl: WideCString,  # LPCWSTR
    pAutoProxyOptions: ptr WINHTTP_AUTOPROXY_OPTIONS,  # WINHTTP_AUTOPROXY_OPTIONS* in/out
    pProxyInfo: ptr WINHTTP_PROXY_INFO  # WINHTTP_PROXY_INFO* in/out
): int32 {.importc: "WinHttpGetProxyForUrl", stdcall, dynlib: "WINHTTP.dll".}
pragma(lib, "winhttp");
extern(Windows)
int WinHttpGetProxyForUrl(
    void* hSession,   // void* in/out
    const(wchar)* lpcwszUrl,   // LPCWSTR
    WINHTTP_AUTOPROXY_OPTIONS* pAutoProxyOptions,   // WINHTTP_AUTOPROXY_OPTIONS* in/out
    WINHTTP_PROXY_INFO* pProxyInfo   // WINHTTP_PROXY_INFO* in/out
);
ccall((:WinHttpGetProxyForUrl, "WINHTTP.dll"), stdcall, Int32,
      (Ptr{Cvoid}, Cwstring, Ptr{WINHTTP_AUTOPROXY_OPTIONS}, Ptr{WINHTTP_PROXY_INFO}),
      hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
# hSession : void* in/out -> Ptr{Cvoid}
# lpcwszUrl : LPCWSTR -> Cwstring
# pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> Ptr{WINHTTP_AUTOPROXY_OPTIONS}
# pProxyInfo : WINHTTP_PROXY_INFO* in/out -> Ptr{WINHTTP_PROXY_INFO}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t WinHttpGetProxyForUrl(
    void* hSession,
    const uint16_t* lpcwszUrl,
    void* pAutoProxyOptions,
    void* pProxyInfo);
]]
local winhttp = ffi.load("winhttp")
-- winhttp.WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
-- hSession : void* in/out
-- lpcwszUrl : LPCWSTR
-- pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out
-- pProxyInfo : WINHTTP_PROXY_INFO* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WINHTTP.dll');
const WinHttpGetProxyForUrl = lib.func('__stdcall', 'WinHttpGetProxyForUrl', 'int32_t', ['void *', 'str16', 'void *', 'void *']);
// WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
// hSession : void* in/out -> 'void *'
// lpcwszUrl : LPCWSTR -> 'str16'
// pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> 'void *'
// pProxyInfo : WINHTTP_PROXY_INFO* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WINHTTP.dll", {
  WinHttpGetProxyForUrl: { parameters: ["pointer", "buffer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo)
// hSession : void* in/out -> "pointer"
// lpcwszUrl : LPCWSTR -> "buffer"
// pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> "pointer"
// pProxyInfo : WINHTTP_PROXY_INFO* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t WinHttpGetProxyForUrl(
    void* hSession,
    const uint16_t* lpcwszUrl,
    void* pAutoProxyOptions,
    void* pProxyInfo);
C, "WINHTTP.dll");
// $ffi->WinHttpGetProxyForUrl(hSession, lpcwszUrl, pAutoProxyOptions, pProxyInfo);
// hSession : void* in/out
// lpcwszUrl : LPCWSTR
// pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out
// pProxyInfo : WINHTTP_PROXY_INFO* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Winhttp extends StdCallLibrary {
    Winhttp INSTANCE = Native.load("winhttp", Winhttp.class);
    boolean WinHttpGetProxyForUrl(
        Pointer hSession,   // void* in/out
        WString lpcwszUrl,   // LPCWSTR
        Pointer pAutoProxyOptions,   // WINHTTP_AUTOPROXY_OPTIONS* in/out
        Pointer pProxyInfo   // WINHTTP_PROXY_INFO* in/out
    );
}
@[Link("winhttp")]
lib LibWINHTTP
  fun WinHttpGetProxyForUrl = WinHttpGetProxyForUrl(
    hSession : Void*,   # void* in/out
    lpcwszUrl : UInt16*,   # LPCWSTR
    pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS*,   # WINHTTP_AUTOPROXY_OPTIONS* in/out
    pProxyInfo : WINHTTP_PROXY_INFO*   # WINHTTP_PROXY_INFO* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef WinHttpGetProxyForUrlNative = Int32 Function(Pointer<Void>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
typedef WinHttpGetProxyForUrlDart = int Function(Pointer<Void>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
final WinHttpGetProxyForUrl = DynamicLibrary.open('WINHTTP.dll')
    .lookupFunction<WinHttpGetProxyForUrlNative, WinHttpGetProxyForUrlDart>('WinHttpGetProxyForUrl');
// hSession : void* in/out -> Pointer<Void>
// lpcwszUrl : LPCWSTR -> Pointer<Utf16>
// pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> Pointer<Void>
// pProxyInfo : WINHTTP_PROXY_INFO* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WinHttpGetProxyForUrl(
  hSession: Pointer;   // void* in/out
  lpcwszUrl: PWideChar;   // LPCWSTR
  pAutoProxyOptions: Pointer;   // WINHTTP_AUTOPROXY_OPTIONS* in/out
  pProxyInfo: Pointer   // WINHTTP_PROXY_INFO* in/out
): BOOL; stdcall;
  external 'WINHTTP.dll' name 'WinHttpGetProxyForUrl';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WinHttpGetProxyForUrl"
  c_WinHttpGetProxyForUrl :: Ptr () -> CWString -> Ptr () -> Ptr () -> IO CInt
-- hSession : void* in/out -> Ptr ()
-- lpcwszUrl : LPCWSTR -> CWString
-- pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> Ptr ()
-- pProxyInfo : WINHTTP_PROXY_INFO* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let winhttpgetproxyforurl =
  foreign "WinHttpGetProxyForUrl"
    ((ptr void) @-> (ptr uint16_t) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* hSession : void* in/out -> (ptr void) *)
(* lpcwszUrl : LPCWSTR -> (ptr uint16_t) *)
(* pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> (ptr void) *)
(* pProxyInfo : WINHTTP_PROXY_INFO* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library winhttp (t "WINHTTP.dll"))
(cffi:use-foreign-library winhttp)

(cffi:defcfun ("WinHttpGetProxyForUrl" win-http-get-proxy-for-url :convention :stdcall) :int32
  (h-session :pointer)   ; void* in/out
  (lpcwsz-url (:string :encoding :utf-16le))   ; LPCWSTR
  (p-auto-proxy-options :pointer)   ; WINHTTP_AUTOPROXY_OPTIONS* in/out
  (p-proxy-info :pointer))   ; WINHTTP_PROXY_INFO* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WinHttpGetProxyForUrl = Win32::API::More->new('WINHTTP',
    'BOOL WinHttpGetProxyForUrl(LPVOID hSession, LPCWSTR lpcwszUrl, LPVOID pAutoProxyOptions, LPVOID pProxyInfo)');
# my $ret = $WinHttpGetProxyForUrl->Call($hSession, $lpcwszUrl, $pAutoProxyOptions, $pProxyInfo);
# hSession : void* in/out -> LPVOID
# lpcwszUrl : LPCWSTR -> LPCWSTR
# pAutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS* in/out -> LPVOID
# pProxyInfo : WINHTTP_PROXY_INFO* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
使用する型