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

HttpOpenRequestW

関数
HTTPリクエストハンドルを作成する(Unicode版)。
DLLWININET.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

// WININET.dll  (Unicode / -W)
#include <windows.h>

void* HttpOpenRequestW(
    void* hConnect,
    LPCWSTR lpszVerb,   // optional
    LPCWSTR lpszObjectName,   // optional
    LPCWSTR lpszVersion,   // optional
    LPCWSTR lpszReferrer,   // optional
    LPCWSTR* lplpszAcceptTypes,   // optional
    DWORD dwFlags,
    UINT_PTR dwContext   // optional
);

パラメーター

名前方向説明
hConnectvoid*inInternetConnect が返した HTTP セッションへのハンドルです。
lpszVerbLPCWSTRinoptionalリクエストで使用する HTTP 動詞を含む null で終わる文字列へのポインターです。このパラメーターが NULL の場合、関数は HTTP 動詞として GET を使用します。
lpszObjectNameLPCWSTRinoptional指定された HTTP 動詞の対象オブジェクトの名前を含む null で終わる文字列へのポインターです。通常はファイル名、実行可能モジュール、または検索指定子です。
lpszVersionLPCWSTRinoptional

リクエストで使用する HTTP バージョンを含む null で終わる文字列へのポインターです。Internet Explorer の設定は、このパラメーターで指定された値を上書きします。

このパラメーターが NULL の場合、関数は Internet Explorer の設定値に応じて HTTP バージョン 1.1 または 1.0 を使用します。

意味
HTTP/1.0
HTTP バージョン 1.0
HTTP/1.1
HTTP バージョン 1.1
lpszReferrerLPCWSTRinoptionalリクエスト内の URL (lpszObjectName) を取得した元のドキュメントの URL を指定する null で終わる文字列へのポインターです。このパラメーターが NULL の場合、リファラーは指定されません。
lplpszAcceptTypesLPCWSTR*inoptional

クライアントが受け入れるメディアタイプを示す null で終わる文字列の配列へのポインターです。以下に例を示します。

PCTSTR rgpszAcceptTypes[] = {_T("text/*"), NULL};

配列を NULL ポインターで適切に終端しないと、クラッシュの原因になります。

このパラメーターが NULL の場合、クライアントはどのタイプも受け入れません。サーバーは一般に、accept タイプが指定されていないことを、クライアントが "text/*" タイプのドキュメント (つまりテキストドキュメントのみで、画像やその他のバイナリファイルは含まない) のみを受け入れると解釈します。!--For more information and a list of valid media types, see ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types. -->

dwFlagsDWORDin

インターネットオプションです。このパラメーターには次のいずれかの値を指定できます。

意味
INTERNET_FLAG_CACHE_IF_NET_FAIL
リソースに対するネットワークリクエストが ERROR_INTERNET_CONNECTION_RESET (サーバーとの接続がリセットされた) または ERROR_INTERNET_CANNOT_CONNECT (サーバーへの接続試行が失敗した) により失敗した場合に、キャッシュからリソースを返します。
INTERNET_FLAG_HYPERLINK
ネットワークから項目を再読み込みするかどうかを判断する際に、サーバーから Expires 時刻も LastModified 時刻も返されなかった場合に、強制的に再読み込みを行います。
INTERNET_FLAG_IGNORE_CERT_CN_INVALID
サーバーから返された SSL/PCT ベースの証明書を、リクエストで指定されたホスト名と照合するチェックを無効にします。WinINet 関数は、ホスト名の一致と単純なワイルドカードルールを比較する簡単なチェックを証明書に対して行います。
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
SSL/PCT ベースの証明書の有効期日の妥当性チェックを無効にします。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
この特殊な種類のリダイレクトの検出を無効にします。このフラグを使用すると、WinINet 関数は HTTPS から HTTP URL へのリダイレクトを透過的に許可します。
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
この特殊な種類のリダイレクトの検出を無効にします。このフラグを使用すると、WinINet 関数は HTTP から HTTPS URL へのリダイレクトを透過的に許可します。
INTERNET_FLAG_KEEP_CONNECTION
接続で利用可能であれば keep-alive セマンティクスを使用します。このフラグは Microsoft Network (MSN)、NT LAN Manager (NTLM)、およびその他の種類の認証に必要です。
INTERNET_FLAG_NEED_FILE
ファイルをキャッシュできない場合に、一時ファイルを作成させます。
INTERNET_FLAG_NO_AUTH
自動的な認証を試行しません。
INTERNET_FLAG_NO_AUTO_REDIRECT
HttpSendRequest でリダイレクトを自動的に処理しません。
INTERNET_FLAG_NO_CACHE_WRITE
返されたエンティティをキャッシュに追加しません。
INTERNET_FLAG_NO_COOKIES
リクエストに Cookie ヘッダーを自動的に追加せず、返された Cookie を Cookie データベースに自動的に追加しません。
INTERNET_FLAG_NO_UI
Cookie ダイアログボックスを無効にします。
INTERNET_FLAG_PRAGMA_NOCACHE
プロキシにキャッシュされたコピーが存在する場合でも、リクエストをオリジンサーバーで解決させます。
INTERNET_FLAG_RELOAD
要求されたファイル、オブジェクト、またはディレクトリ一覧を、キャッシュからではなくオリジンサーバーから強制的にダウンロードします。
INTERNET_FLAG_RESYNCHRONIZE
前回ダウンロードした時点以降にリソースが変更されている場合に、HTTP リソースを再読み込みします。すべての FTP リソースは再読み込みされます。

Windows XP および Windows Server 2003 R2 以前: Gopher リソースも再読み込みされます。

INTERNET_FLAG_SECURE
セキュアなトランザクションセマンティクスを使用します。これは Secure Sockets Layer/Private Communications Technology (SSL/PCT) の使用を意味し、HTTP リクエストでのみ有効です。
dwContextUINT_PTRinoptionalこの操作を任意のアプリケーションデータと関連付ける、アプリケーション定義の値を含む変数へのポインターです。

戻り値の型: void*

公式ドキュメント

HTTP リクエストハンドルを作成します。(Unicode)

戻り値

成功した場合は HTTP リクエストハンドルを返し、それ以外の場合は NULL を返します。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説(Remarks)

HttpOpenRequest 関数は新しい HTTP リクエストハンドルを作成し、指定されたパラメーターをそのハンドルに格納します。HTTP リクエストハンドルは、HTTP サーバーに送信するリクエストを保持し、リクエストの一部として送信されるすべての RFC822/MIME/HTTP ヘッダーを含みます。

"GET" または "POST" 以外の動詞が指定された場合、HttpOpenRequest はそのリクエストに対して INTERNET_FLAG_NO_CACHE_WRITEINTERNET_FLAG_RELOAD を自動的に設定します。

Microsoft Internet Explorer 5 以降では、lpszVerb が "HEAD" に設定されている場合、HTTP/1.1 サーバーからの応答で Content-Length ヘッダーは無視されます。

Windows 7、Windows Server 2008 R2 以降では、lpszVersion パラメーターは Internet Explorer の設定によって上書きされます。EnableHttp1_1HKLM\Software\Microsoft\InternetExplorer\AdvacnedOptions\HTTP\GENABLE 配下のレジストリ値で、システムの Internet Explorer で設定されたインターネットオプションによって制御されます。EnableHttp1_1 値の既定値は 1 です。EnableHttp1_1 が 1 に設定されている場合、HttpOpenRequest 関数は 1.1 未満の HTTP バージョンを HTTP バージョン 1.1 にアップグレードします。

呼び出し側アプリケーションが HttpOpenRequest によって返された HINTERNET ハンドルの使用を終えた後は、InternetCloseHandle 関数を使用してハンドルを閉じる必要があります。

注意 リクエストが非同期モードで送信され (InternetOpendwFlags パラメーターに INTERNET_FLAG_ASYNC を指定)、かつ dwContext パラメーターが 0 (INTERNET_NO_CALLBACK) の場合、リクエストハンドルに対して InternetSetStatusCallback で設定したコールバック関数は呼び出されませんが、呼び出しは引き続き非同期モードで実行されます。

WinINet API の他のすべての側面と同様に、この関数は DllMain やグローバルオブジェクトのコンストラクター・デストラクター内から安全に呼び出すことはできません。

注意 WinINet はサーバー実装をサポートしていません。また、サービスから使用すべきではありません。サーバー実装やサービスには Microsoft Windows HTTP Services (WinHTTP) を使用してください。
メモ

wininet.h ヘッダーは HttpOpenRequest を、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして定義しています。エンコーディング非依存のエイリアスの使用と、エンコーディング非依存でないコードを混在させると、コンパイルエラーや実行時エラーを引き起こす不一致が生じる可能性があります。詳細については、関数プロトタイプの規則 を参照してください。

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

各言語での呼び出し定義

// WININET.dll  (Unicode / -W)
#include <windows.h>

void* HttpOpenRequestW(
    void* hConnect,
    LPCWSTR lpszVerb,   // optional
    LPCWSTR lpszObjectName,   // optional
    LPCWSTR lpszVersion,   // optional
    LPCWSTR lpszReferrer,   // optional
    LPCWSTR* lplpszAcceptTypes,   // optional
    DWORD dwFlags,
    UINT_PTR dwContext   // optional
);
[DllImport("WININET.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern IntPtr HttpOpenRequestW(
    IntPtr hConnect,   // void*
    [MarshalAs(UnmanagedType.LPWStr)] string lpszVerb,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string lpszObjectName,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string lpszVersion,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string lpszReferrer,   // LPCWSTR optional
    IntPtr lplpszAcceptTypes,   // LPCWSTR* optional
    uint dwFlags,   // DWORD
    UIntPtr dwContext   // UINT_PTR optional
);
<DllImport("WININET.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function HttpOpenRequestW(
    hConnect As IntPtr,   ' void*
    <MarshalAs(UnmanagedType.LPWStr)> lpszVerb As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpszObjectName As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpszVersion As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpszReferrer As String,   ' LPCWSTR optional
    lplpszAcceptTypes As IntPtr,   ' LPCWSTR* optional
    dwFlags As UInteger,   ' DWORD
    dwContext As UIntPtr   ' UINT_PTR optional
) As IntPtr
End Function
' hConnect : void*
' lpszVerb : LPCWSTR optional
' lpszObjectName : LPCWSTR optional
' lpszVersion : LPCWSTR optional
' lpszReferrer : LPCWSTR optional
' lplpszAcceptTypes : LPCWSTR* optional
' dwFlags : DWORD
' dwContext : UINT_PTR optional
Declare PtrSafe Function HttpOpenRequestW Lib "wininet" ( _
    ByVal hConnect As LongPtr, _
    ByVal lpszVerb As LongPtr, _
    ByVal lpszObjectName As LongPtr, _
    ByVal lpszVersion As LongPtr, _
    ByVal lpszReferrer As LongPtr, _
    ByVal lplpszAcceptTypes As LongPtr, _
    ByVal dwFlags As Long, _
    ByVal dwContext As LongPtr) As LongPtr
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

HttpOpenRequestW = ctypes.windll.wininet.HttpOpenRequestW
HttpOpenRequestW.restype = ctypes.c_void_p
HttpOpenRequestW.argtypes = [
    ctypes.POINTER(None),  # hConnect : void*
    wintypes.LPCWSTR,  # lpszVerb : LPCWSTR optional
    wintypes.LPCWSTR,  # lpszObjectName : LPCWSTR optional
    wintypes.LPCWSTR,  # lpszVersion : LPCWSTR optional
    wintypes.LPCWSTR,  # lpszReferrer : LPCWSTR optional
    ctypes.c_void_p,  # lplpszAcceptTypes : LPCWSTR* optional
    wintypes.DWORD,  # dwFlags : DWORD
    ctypes.c_size_t,  # dwContext : UINT_PTR optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WININET.dll')
HttpOpenRequestW = Fiddle::Function.new(
  lib['HttpOpenRequestW'],
  [
    Fiddle::TYPE_VOIDP,  # hConnect : void*
    Fiddle::TYPE_VOIDP,  # lpszVerb : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpszObjectName : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpszVersion : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpszReferrer : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lplpszAcceptTypes : LPCWSTR* optional
    -Fiddle::TYPE_INT,  # dwFlags : DWORD
    Fiddle::TYPE_UINTPTR_T,  # dwContext : UINT_PTR optional
  ],
  Fiddle::TYPE_VOIDP)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "wininet")]
extern "system" {
    fn HttpOpenRequestW(
        hConnect: *mut (),  // void*
        lpszVerb: *const u16,  // LPCWSTR optional
        lpszObjectName: *const u16,  // LPCWSTR optional
        lpszVersion: *const u16,  // LPCWSTR optional
        lpszReferrer: *const u16,  // LPCWSTR optional
        lplpszAcceptTypes: *const *const u16,  // LPCWSTR* optional
        dwFlags: u32,  // DWORD
        dwContext: usize  // UINT_PTR optional
    ) -> *mut ();
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WININET.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr HttpOpenRequestW(IntPtr hConnect, [MarshalAs(UnmanagedType.LPWStr)] string lpszVerb, [MarshalAs(UnmanagedType.LPWStr)] string lpszObjectName, [MarshalAs(UnmanagedType.LPWStr)] string lpszVersion, [MarshalAs(UnmanagedType.LPWStr)] string lpszReferrer, IntPtr lplpszAcceptTypes, uint dwFlags, UIntPtr dwContext);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WININET_HttpOpenRequestW' -Namespace Win32 -PassThru
# $api::HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
#uselib "WININET.dll"
#func global HttpOpenRequestW "HttpOpenRequestW" wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr
; HttpOpenRequestW hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, varptr(lplpszAcceptTypes), dwFlags, dwContext   ; 戻り値は stat
; hConnect : void* -> "wptr"
; lpszVerb : LPCWSTR optional -> "wptr"
; lpszObjectName : LPCWSTR optional -> "wptr"
; lpszVersion : LPCWSTR optional -> "wptr"
; lpszReferrer : LPCWSTR optional -> "wptr"
; lplpszAcceptTypes : LPCWSTR* optional -> "wptr"
; dwFlags : DWORD -> "wptr"
; dwContext : UINT_PTR optional -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WININET.dll"
#cfunc global HttpOpenRequestW "HttpOpenRequestW" sptr, wstr, wstr, wstr, wstr, var, int, sptr
; res = HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
; hConnect : void* -> "sptr"
; lpszVerb : LPCWSTR optional -> "wstr"
; lpszObjectName : LPCWSTR optional -> "wstr"
; lpszVersion : LPCWSTR optional -> "wstr"
; lpszReferrer : LPCWSTR optional -> "wstr"
; lplpszAcceptTypes : LPCWSTR* optional -> "var"
; dwFlags : DWORD -> "int"
; dwContext : UINT_PTR optional -> "sptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; void* HttpOpenRequestW(void* hConnect, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPCWSTR* lplpszAcceptTypes, DWORD dwFlags, UINT_PTR dwContext)
#uselib "WININET.dll"
#cfunc global HttpOpenRequestW "HttpOpenRequestW" intptr, wstr, wstr, wstr, wstr, var, int, intptr
; res = HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
; hConnect : void* -> "intptr"
; lpszVerb : LPCWSTR optional -> "wstr"
; lpszObjectName : LPCWSTR optional -> "wstr"
; lpszVersion : LPCWSTR optional -> "wstr"
; lpszReferrer : LPCWSTR optional -> "wstr"
; lplpszAcceptTypes : LPCWSTR* optional -> "var"
; dwFlags : DWORD -> "int"
; dwContext : UINT_PTR optional -> "intptr"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	wininet = windows.NewLazySystemDLL("WININET.dll")
	procHttpOpenRequestW = wininet.NewProc("HttpOpenRequestW")
)

// hConnect (void*), lpszVerb (LPCWSTR optional), lpszObjectName (LPCWSTR optional), lpszVersion (LPCWSTR optional), lpszReferrer (LPCWSTR optional), lplpszAcceptTypes (LPCWSTR* optional), dwFlags (DWORD), dwContext (UINT_PTR optional)
r1, _, err := procHttpOpenRequestW.Call(
	uintptr(hConnect),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpszVerb))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpszObjectName))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpszVersion))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpszReferrer))),
	uintptr(lplpszAcceptTypes),
	uintptr(dwFlags),
	uintptr(dwContext),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void*
function HttpOpenRequestW(
  hConnect: Pointer;   // void*
  lpszVerb: PWideChar;   // LPCWSTR optional
  lpszObjectName: PWideChar;   // LPCWSTR optional
  lpszVersion: PWideChar;   // LPCWSTR optional
  lpszReferrer: PWideChar;   // LPCWSTR optional
  lplpszAcceptTypes: PPWideChar;   // LPCWSTR* optional
  dwFlags: DWORD;   // DWORD
  dwContext: NativeUInt   // UINT_PTR optional
): Pointer; stdcall;
  external 'WININET.dll' name 'HttpOpenRequestW';
result := DllCall("WININET\HttpOpenRequestW"
    , "Ptr", hConnect   ; void*
    , "WStr", lpszVerb   ; LPCWSTR optional
    , "WStr", lpszObjectName   ; LPCWSTR optional
    , "WStr", lpszVersion   ; LPCWSTR optional
    , "WStr", lpszReferrer   ; LPCWSTR optional
    , "Ptr", lplpszAcceptTypes   ; LPCWSTR* optional
    , "UInt", dwFlags   ; DWORD
    , "UPtr", dwContext   ; UINT_PTR optional
    , "Ptr")   ; return: void*
●HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext) = DLL("WININET.dll", "void* HttpOpenRequestW(void*, char*, char*, char*, char*, void*, dword, int)")
# 呼び出し: HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
# hConnect : void* -> "void*"
# lpszVerb : LPCWSTR optional -> "char*"
# lpszObjectName : LPCWSTR optional -> "char*"
# lpszVersion : LPCWSTR optional -> "char*"
# lpszReferrer : LPCWSTR optional -> "char*"
# lplpszAcceptTypes : LPCWSTR* optional -> "void*"
# dwFlags : DWORD -> "dword"
# dwContext : UINT_PTR optional -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "wininet" fn HttpOpenRequestW(
    hConnect: ?*anyopaque, // void*
    lpszVerb: [*c]const u16, // LPCWSTR optional
    lpszObjectName: [*c]const u16, // LPCWSTR optional
    lpszVersion: [*c]const u16, // LPCWSTR optional
    lpszReferrer: [*c]const u16, // LPCWSTR optional
    lplpszAcceptTypes: [*c][*c]u16, // LPCWSTR* optional
    dwFlags: u32, // DWORD
    dwContext: usize // UINT_PTR optional
) callconv(std.os.windows.WINAPI) ?*anyopaque;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc HttpOpenRequestW(
    hConnect: pointer,  # void*
    lpszVerb: WideCString,  # LPCWSTR optional
    lpszObjectName: WideCString,  # LPCWSTR optional
    lpszVersion: WideCString,  # LPCWSTR optional
    lpszReferrer: WideCString,  # LPCWSTR optional
    lplpszAcceptTypes: ptr WideCString,  # LPCWSTR* optional
    dwFlags: uint32,  # DWORD
    dwContext: uint  # UINT_PTR optional
): pointer {.importc: "HttpOpenRequestW", stdcall, dynlib: "WININET.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "wininet");
extern(Windows)
void* HttpOpenRequestW(
    void* hConnect,   // void*
    const(wchar)* lpszVerb,   // LPCWSTR optional
    const(wchar)* lpszObjectName,   // LPCWSTR optional
    const(wchar)* lpszVersion,   // LPCWSTR optional
    const(wchar)* lpszReferrer,   // LPCWSTR optional
    wchar** lplpszAcceptTypes,   // LPCWSTR* optional
    uint dwFlags,   // DWORD
    size_t dwContext   // UINT_PTR optional
);
ccall((:HttpOpenRequestW, "WININET.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, Cwstring, Cwstring, Cwstring, Cwstring, Ptr{Ptr{UInt16}}, UInt32, Csize_t),
      hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
# hConnect : void* -> Ptr{Cvoid}
# lpszVerb : LPCWSTR optional -> Cwstring
# lpszObjectName : LPCWSTR optional -> Cwstring
# lpszVersion : LPCWSTR optional -> Cwstring
# lpszReferrer : LPCWSTR optional -> Cwstring
# lplpszAcceptTypes : LPCWSTR* optional -> Ptr{Ptr{UInt16}}
# dwFlags : DWORD -> UInt32
# dwContext : UINT_PTR optional -> Csize_t
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
void* HttpOpenRequestW(
    void* hConnect,
    const uint16_t* lpszVerb,
    const uint16_t* lpszObjectName,
    const uint16_t* lpszVersion,
    const uint16_t* lpszReferrer,
    uint16_t** lplpszAcceptTypes,
    uint32_t dwFlags,
    uintptr_t dwContext);
]]
local wininet = ffi.load("wininet")
-- wininet.HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
-- hConnect : void*
-- lpszVerb : LPCWSTR optional
-- lpszObjectName : LPCWSTR optional
-- lpszVersion : LPCWSTR optional
-- lpszReferrer : LPCWSTR optional
-- lplpszAcceptTypes : LPCWSTR* optional
-- dwFlags : DWORD
-- dwContext : UINT_PTR optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('WININET.dll');
const HttpOpenRequestW = lib.func('__stdcall', 'HttpOpenRequestW', 'void *', ['void *', 'str16', 'str16', 'str16', 'str16', 'void *', 'uint32_t', 'uintptr_t']);
// HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
// hConnect : void* -> 'void *'
// lpszVerb : LPCWSTR optional -> 'str16'
// lpszObjectName : LPCWSTR optional -> 'str16'
// lpszVersion : LPCWSTR optional -> 'str16'
// lpszReferrer : LPCWSTR optional -> 'str16'
// lplpszAcceptTypes : LPCWSTR* optional -> 'void *'
// dwFlags : DWORD -> 'uint32_t'
// dwContext : UINT_PTR optional -> 'uintptr_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WININET.dll", {
  HttpOpenRequestW: { parameters: ["pointer", "buffer", "buffer", "buffer", "buffer", "pointer", "u32", "usize"], result: "pointer" },
});
// lib.symbols.HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext)
// hConnect : void* -> "pointer"
// lpszVerb : LPCWSTR optional -> "buffer"
// lpszObjectName : LPCWSTR optional -> "buffer"
// lpszVersion : LPCWSTR optional -> "buffer"
// lpszReferrer : LPCWSTR optional -> "buffer"
// lplpszAcceptTypes : LPCWSTR* optional -> "pointer"
// dwFlags : DWORD -> "u32"
// dwContext : UINT_PTR optional -> "usize"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* HttpOpenRequestW(
    void* hConnect,
    const uint16_t* lpszVerb,
    const uint16_t* lpszObjectName,
    const uint16_t* lpszVersion,
    const uint16_t* lpszReferrer,
    uint16_t** lplpszAcceptTypes,
    uint32_t dwFlags,
    size_t dwContext);
C, "WININET.dll");
// $ffi->HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes, dwFlags, dwContext);
// hConnect : void*
// lpszVerb : LPCWSTR optional
// lpszObjectName : LPCWSTR optional
// lpszVersion : LPCWSTR optional
// lpszReferrer : LPCWSTR optional
// lplpszAcceptTypes : LPCWSTR* optional
// dwFlags : DWORD
// dwContext : UINT_PTR optional
// 構造体/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 Wininet extends StdCallLibrary {
    Wininet INSTANCE = Native.load("wininet", Wininet.class, W32APIOptions.UNICODE_OPTIONS);
    Pointer HttpOpenRequestW(
        Pointer hConnect,   // void*
        WString lpszVerb,   // LPCWSTR optional
        WString lpszObjectName,   // LPCWSTR optional
        WString lpszVersion,   // LPCWSTR optional
        WString lpszReferrer,   // LPCWSTR optional
        PointerByReference lplpszAcceptTypes,   // LPCWSTR* optional
        int dwFlags,   // DWORD
        long dwContext   // UINT_PTR optional
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("wininet")]
lib LibWININET
  fun HttpOpenRequestW = HttpOpenRequestW(
    hConnect : Void*,   # void*
    lpszVerb : UInt16*,   # LPCWSTR optional
    lpszObjectName : UInt16*,   # LPCWSTR optional
    lpszVersion : UInt16*,   # LPCWSTR optional
    lpszReferrer : UInt16*,   # LPCWSTR optional
    lplpszAcceptTypes : UInt16**,   # LPCWSTR* optional
    dwFlags : UInt32,   # DWORD
    dwContext : LibC::SizeT   # UINT_PTR optional
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef HttpOpenRequestWNative = Pointer<Void> Function(Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Pointer<Utf16>>, Uint32, UintPtr);
typedef HttpOpenRequestWDart = Pointer<Void> Function(Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Pointer<Utf16>>, int, int);
final HttpOpenRequestW = DynamicLibrary.open('WININET.dll')
    .lookupFunction<HttpOpenRequestWNative, HttpOpenRequestWDart>('HttpOpenRequestW');
// hConnect : void* -> Pointer<Void>
// lpszVerb : LPCWSTR optional -> Pointer<Utf16>
// lpszObjectName : LPCWSTR optional -> Pointer<Utf16>
// lpszVersion : LPCWSTR optional -> Pointer<Utf16>
// lpszReferrer : LPCWSTR optional -> Pointer<Utf16>
// lplpszAcceptTypes : LPCWSTR* optional -> Pointer<Pointer<Utf16>>
// dwFlags : DWORD -> Uint32
// dwContext : UINT_PTR optional -> UintPtr
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function HttpOpenRequestW(
  hConnect: Pointer;   // void*
  lpszVerb: PWideChar;   // LPCWSTR optional
  lpszObjectName: PWideChar;   // LPCWSTR optional
  lpszVersion: PWideChar;   // LPCWSTR optional
  lpszReferrer: PWideChar;   // LPCWSTR optional
  lplpszAcceptTypes: PPWideChar;   // LPCWSTR* optional
  dwFlags: DWORD;   // DWORD
  dwContext: NativeUInt   // UINT_PTR optional
): Pointer; stdcall;
  external 'WININET.dll' name 'HttpOpenRequestW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "HttpOpenRequestW"
  c_HttpOpenRequestW :: Ptr () -> CWString -> CWString -> CWString -> CWString -> Ptr CWString -> Word32 -> CUIntPtr -> IO (Ptr ())
-- hConnect : void* -> Ptr ()
-- lpszVerb : LPCWSTR optional -> CWString
-- lpszObjectName : LPCWSTR optional -> CWString
-- lpszVersion : LPCWSTR optional -> CWString
-- lpszReferrer : LPCWSTR optional -> CWString
-- lplpszAcceptTypes : LPCWSTR* optional -> Ptr CWString
-- dwFlags : DWORD -> Word32
-- dwContext : UINT_PTR optional -> CUIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let httpopenrequestw =
  foreign "HttpOpenRequestW"
    ((ptr void) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr (ptr uint16_t)) @-> uint32_t @-> size_t @-> returning (ptr void))
(* hConnect : void* -> (ptr void) *)
(* lpszVerb : LPCWSTR optional -> (ptr uint16_t) *)
(* lpszObjectName : LPCWSTR optional -> (ptr uint16_t) *)
(* lpszVersion : LPCWSTR optional -> (ptr uint16_t) *)
(* lpszReferrer : LPCWSTR optional -> (ptr uint16_t) *)
(* lplpszAcceptTypes : LPCWSTR* optional -> (ptr (ptr uint16_t)) *)
(* dwFlags : DWORD -> uint32_t *)
(* dwContext : UINT_PTR optional -> size_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library wininet (t "WININET.dll"))
(cffi:use-foreign-library wininet)

(cffi:defcfun ("HttpOpenRequestW" http-open-request-w :convention :stdcall) :pointer
  (h-connect :pointer)   ; void*
  (lpsz-verb (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lpsz-object-name (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lpsz-version (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lpsz-referrer (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lplpsz-accept-types :pointer)   ; LPCWSTR* optional
  (dw-flags :uint32)   ; DWORD
  (dw-context :uint64))   ; UINT_PTR optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $HttpOpenRequestW = Win32::API::More->new('WININET',
    'LPVOID HttpOpenRequestW(LPVOID hConnect, LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion, LPCWSTR lpszReferrer, LPVOID lplpszAcceptTypes, DWORD dwFlags, WPARAM dwContext)');
# my $ret = $HttpOpenRequestW->Call($hConnect, $lpszVerb, $lpszObjectName, $lpszVersion, $lpszReferrer, $lplpszAcceptTypes, $dwFlags, $dwContext);
# hConnect : void* -> LPVOID
# lpszVerb : LPCWSTR optional -> LPCWSTR
# lpszObjectName : LPCWSTR optional -> LPCWSTR
# lpszVersion : LPCWSTR optional -> LPCWSTR
# lpszReferrer : LPCWSTR optional -> LPCWSTR
# lplpszAcceptTypes : LPCWSTR* optional -> LPVOID
# dwFlags : DWORD -> DWORD
# dwContext : UINT_PTR optional -> WPARAM
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い