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

WinHttpOpenRequest

関数
HTTP要求ハンドルを作成する。
DLLWINHTTP.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

void* WinHttpOpenRequest(
    void* hConnect,
    LPCWSTR pwszVerb,
    LPCWSTR pwszObjectName,
    LPCWSTR pwszVersion,
    LPCWSTR pwszReferrer,
    LPCWSTR* ppwszAcceptTypes,
    WINHTTP_OPEN_REQUEST_FLAGS dwFlags
);

パラメーター

名前方向説明
hConnectvoid*inoutHINTERNET 形式の、 WinHttpConnect によって返された HTTP セッションへの接続ハンドルです。
pwszVerbLPCWSTRinリクエストで使用する HTTP 動詞 を含む文字列へのポインターです。このパラメーターが NULL の場合、関数は HTTP 動詞 として GET を使用します。注意 この文字列はすべて大文字にしてください。多くのサーバーは HTTP 動詞を大文字と小文字を区別して扱い、Internet Engineering Task Force (IETF) の Requests for Comments (RFC) ではこれらの動詞を大文字のみで表記しています。
pwszObjectNameLPCWSTRin指定した HTTP 動詞の対象リソース名を含む null 終端文字列へのポインターです。これは通常、ファイル名、実行可能モジュール、または検索指定子です。
pwszVersionLPCWSTRinHTTP バージョンを含む文字列へのポインターです。このパラメーターが NULL の場合、関数は HTTP/1.1 を使用します。
pwszReferrerLPCWSTRinリクエスト内の pwszObjectName の URL を取得した元のドキュメントの URL を指定する文字列へのポインターです。このパラメーターが WINHTTP_NO_REFERER に設定されている場合、参照元ドキュメントは指定されません。
ppwszAcceptTypesLPCWSTR*inクライアントが受け入れるメディアタイプを指定する文字列ポインターの null 終端配列へのポインターです。このパラメーターが WINHTTP_DEFAULT_ACCEPT_TYPES に設定されている場合、クライアントは一切のタイプを受け入れません。通常、サーバーは受け入れ可能なタイプが指定されていない場合、クライアントが "text/*" 型のドキュメントのみ、つまりテキストドキュメントのみを受け入れ、画像やその他のバイナリファイルは受け入れないものとして扱います。有効なメディアタイプの一覧については、IANA が定義する Media Types (http://www.iana.org/assignments/media-types/) を参照してください。
dwFlagsWINHTTP_OPEN_REQUEST_FLAGSin

Internet フラグ値を含む符号なしロング整数値です。次の値のうち 1 つ以上を指定できます。

意味
WINHTTP_FLAG_BYPASS_PROXY_CACHE
このフラグは WINHTTP_FLAG_REFRESH と同じ動作を提供します。
WINHTTP_FLAG_ESCAPE_DISABLE
pwszObjectName に渡された URL 内の安全でない文字は、エスケープシーケンスに変換されません。
WINHTTP_FLAG_ESCAPE_DISABLE_QUERY
pwszObjectName に渡された URL のクエリ部分にある安全でない文字は、エスケープシーケンスに変換されません。
WINHTTP_FLAG_ESCAPE_PERCENT
pwszObjectName に渡された文字列が LPCWSTR から LPSTR に変換されます。パーセント記号を含むすべての安全でない文字がエスケープシーケンスに変換されます。既定では、パーセント記号を除くすべての安全でない文字がエスケープシーケンスに変換されます。
WINHTTP_FLAG_NULL_CODEPAGE
pwszObjectName に渡された文字列は、WCHAR で表現された有効な ANSI 文字で構成されているものとみなされます。安全でない文字のチェックは行われません。

Windows 7: このオプションは廃止されました。

WINHTTP_FLAG_REFRESH
リクエストを、プロキシサーバーからのキャッシュされたリソースのバージョンを送信するのではなく、元のサーバーに転送する必要があることを示します。このフラグを使用すると、"Pragma: no-cache" ヘッダーがリクエストハンドルに追加されます。HTTP/1.1 のリクエストヘッダーを作成する場合は、"Cache-Control: no-cache" も追加されます。
WINHTTP_FLAG_SECURE
セキュアなトランザクションセマンティクスを使用します。これは Secure Sockets Layer (SSL)/Transport Layer Security (TLS) の使用に相当します。

戻り値の型: void*

公式ドキュメント

WinHttpOpenRequest 関数は、HTTP リクエストハンドルを作成します。

戻り値

成功した場合は有効な HTTP リクエストハンドルを、失敗した場合は NULL を返します。拡張エラー情報を取得するには、 GetLastError を呼び出します。返されるエラーコードには次のものがあります。

エラーコード 説明
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
指定されたハンドルの種類がこの操作に対して正しくありません。
ERROR_WINHTTP_INTERNAL_ERROR
内部エラーが発生しました。
ERROR_WINHTTP_INVALID_URL
URL が無効です。
ERROR_WINHTTP_OPERATION_CANCELLED
操作がキャンセルされました。通常、これはリクエストが処理していたハンドルが操作完了前に閉じられたために発生します。
ERROR_WINHTTP_UNRECOGNIZED_SCHEME
URL に "http:" または "https:" 以外のスキームが指定されました。
ERROR_NOT_ENOUGH_MEMORY
要求された操作を完了するのに十分なメモリがありませんでした。(Windows エラーコード)

解説(Remarks)

戻り値は成功または失敗を示します。拡張エラー情報を取得するには、 GetLastError を呼び出します。

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

pwszVerb が "HEAD" に設定されている場合、Content-Length ヘッダーは無視されます。

ステータスコールバック関数が WinHttpSetStatusCallback でインストールされている場合、WINHTTP_CALLBACK_STATUS_HANDLE_CREATED 通知は WinHttpOpenRequest がリクエストハンドルを作成したことを示します。

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

注意 Windows XP および Windows 2000 については、WinHttp スタートページの 実行時要件 セクションを参照してください。

この例では、 HINTERNET ハンドルを取得し、HTTP セッションを開き、リクエストヘッダーを作成して、そのヘッダーをサーバーに送信する方法を示します。


    BOOL  bResults = FALSE;
    HINTERNET hSession = NULL,
              hConnect = NULL,
              hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen(  L"A WinHTTP Example Program/1.0", 
                             WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                             WINHTTP_NO_PROXY_NAME, 
                             WINHTTP_NO_PROXY_BYPASS, 0);

    // Specify an HTTP server.
    if (hSession)
        hConnect = WinHttpConnect( hSession, L"www.wingtiptoys.com",
                                   INTERNET_DEFAULT_HTTP_PORT, 0);

    // Create an HTTP Request handle.
    if (hConnect)
        hRequest = WinHttpOpenRequest( hConnect, L"PUT", 
                                       L"/writetst.txt", 
                                       NULL, WINHTTP_NO_REFERER, 
                                       WINHTTP_DEFAULT_ACCEPT_TYPES,
                                       0);

    // Send a Request.
    if (hRequest) 
        bResults = WinHttpSendRequest( hRequest, 
                                       WINHTTP_NO_ADDITIONAL_HEADERS,
                                       0, WINHTTP_NO_REQUEST_DATA, 0, 
                                       0, 0);

    // PLACE ADDITIONAL CODE HERE.

    // Report any errors.
    if (!bResults)
        printf( "Error %d has occurred.\n", GetLastError());

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

各言語での呼び出し定義

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

void* WinHttpOpenRequest(
    void* hConnect,
    LPCWSTR pwszVerb,
    LPCWSTR pwszObjectName,
    LPCWSTR pwszVersion,
    LPCWSTR pwszReferrer,
    LPCWSTR* ppwszAcceptTypes,
    WINHTTP_OPEN_REQUEST_FLAGS dwFlags
);
[DllImport("WINHTTP.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr WinHttpOpenRequest(
    IntPtr hConnect,   // void* in/out
    [MarshalAs(UnmanagedType.LPWStr)] string pwszVerb,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszObjectName,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszVersion,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string pwszReferrer,   // LPCWSTR
    IntPtr ppwszAcceptTypes,   // LPCWSTR*
    uint dwFlags   // WINHTTP_OPEN_REQUEST_FLAGS
);
<DllImport("WINHTTP.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function WinHttpOpenRequest(
    hConnect As IntPtr,   ' void* in/out
    <MarshalAs(UnmanagedType.LPWStr)> pwszVerb As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszObjectName As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszVersion As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> pwszReferrer As String,   ' LPCWSTR
    ppwszAcceptTypes As IntPtr,   ' LPCWSTR*
    dwFlags As UInteger   ' WINHTTP_OPEN_REQUEST_FLAGS
) As IntPtr
End Function
' hConnect : void* in/out
' pwszVerb : LPCWSTR
' pwszObjectName : LPCWSTR
' pwszVersion : LPCWSTR
' pwszReferrer : LPCWSTR
' ppwszAcceptTypes : LPCWSTR*
' dwFlags : WINHTTP_OPEN_REQUEST_FLAGS
Declare PtrSafe Function WinHttpOpenRequest Lib "winhttp" ( _
    ByVal hConnect As LongPtr, _
    ByVal pwszVerb As LongPtr, _
    ByVal pwszObjectName As LongPtr, _
    ByVal pwszVersion As LongPtr, _
    ByVal pwszReferrer As LongPtr, _
    ByVal ppwszAcceptTypes As LongPtr, _
    ByVal dwFlags As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

WinHttpOpenRequest = ctypes.windll.winhttp.WinHttpOpenRequest
WinHttpOpenRequest.restype = ctypes.c_void_p
WinHttpOpenRequest.argtypes = [
    ctypes.POINTER(None),  # hConnect : void* in/out
    wintypes.LPCWSTR,  # pwszVerb : LPCWSTR
    wintypes.LPCWSTR,  # pwszObjectName : LPCWSTR
    wintypes.LPCWSTR,  # pwszVersion : LPCWSTR
    wintypes.LPCWSTR,  # pwszReferrer : LPCWSTR
    ctypes.c_void_p,  # ppwszAcceptTypes : LPCWSTR*
    wintypes.DWORD,  # dwFlags : WINHTTP_OPEN_REQUEST_FLAGS
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

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

var (
	winhttp = windows.NewLazySystemDLL("WINHTTP.dll")
	procWinHttpOpenRequest = winhttp.NewProc("WinHttpOpenRequest")
)

// hConnect (void* in/out), pwszVerb (LPCWSTR), pwszObjectName (LPCWSTR), pwszVersion (LPCWSTR), pwszReferrer (LPCWSTR), ppwszAcceptTypes (LPCWSTR*), dwFlags (WINHTTP_OPEN_REQUEST_FLAGS)
r1, _, err := procWinHttpOpenRequest.Call(
	uintptr(hConnect),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszVerb))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszObjectName))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszVersion))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(pwszReferrer))),
	uintptr(ppwszAcceptTypes),
	uintptr(dwFlags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void*
function WinHttpOpenRequest(
  hConnect: Pointer;   // void* in/out
  pwszVerb: PWideChar;   // LPCWSTR
  pwszObjectName: PWideChar;   // LPCWSTR
  pwszVersion: PWideChar;   // LPCWSTR
  pwszReferrer: PWideChar;   // LPCWSTR
  ppwszAcceptTypes: PPWideChar;   // LPCWSTR*
  dwFlags: DWORD   // WINHTTP_OPEN_REQUEST_FLAGS
): Pointer; stdcall;
  external 'WINHTTP.dll' name 'WinHttpOpenRequest';
result := DllCall("WINHTTP\WinHttpOpenRequest"
    , "Ptr", hConnect   ; void* in/out
    , "WStr", pwszVerb   ; LPCWSTR
    , "WStr", pwszObjectName   ; LPCWSTR
    , "WStr", pwszVersion   ; LPCWSTR
    , "WStr", pwszReferrer   ; LPCWSTR
    , "Ptr", ppwszAcceptTypes   ; LPCWSTR*
    , "UInt", dwFlags   ; WINHTTP_OPEN_REQUEST_FLAGS
    , "Ptr")   ; return: void*
●WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags) = DLL("WINHTTP.dll", "void* WinHttpOpenRequest(void*, char*, char*, char*, char*, void*, dword)")
# 呼び出し: WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags)
# hConnect : void* in/out -> "void*"
# pwszVerb : LPCWSTR -> "char*"
# pwszObjectName : LPCWSTR -> "char*"
# pwszVersion : LPCWSTR -> "char*"
# pwszReferrer : LPCWSTR -> "char*"
# ppwszAcceptTypes : LPCWSTR* -> "void*"
# dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "winhttp" fn WinHttpOpenRequest(
    hConnect: ?*anyopaque, // void* in/out
    pwszVerb: [*c]const u16, // LPCWSTR
    pwszObjectName: [*c]const u16, // LPCWSTR
    pwszVersion: [*c]const u16, // LPCWSTR
    pwszReferrer: [*c]const u16, // LPCWSTR
    ppwszAcceptTypes: [*c][*c]u16, // LPCWSTR*
    dwFlags: u32 // WINHTTP_OPEN_REQUEST_FLAGS
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc WinHttpOpenRequest(
    hConnect: pointer,  # void* in/out
    pwszVerb: WideCString,  # LPCWSTR
    pwszObjectName: WideCString,  # LPCWSTR
    pwszVersion: WideCString,  # LPCWSTR
    pwszReferrer: WideCString,  # LPCWSTR
    ppwszAcceptTypes: ptr WideCString,  # LPCWSTR*
    dwFlags: uint32  # WINHTTP_OPEN_REQUEST_FLAGS
): pointer {.importc: "WinHttpOpenRequest", stdcall, dynlib: "WINHTTP.dll".}
pragma(lib, "winhttp");
extern(Windows)
void* WinHttpOpenRequest(
    void* hConnect,   // void* in/out
    const(wchar)* pwszVerb,   // LPCWSTR
    const(wchar)* pwszObjectName,   // LPCWSTR
    const(wchar)* pwszVersion,   // LPCWSTR
    const(wchar)* pwszReferrer,   // LPCWSTR
    wchar** ppwszAcceptTypes,   // LPCWSTR*
    uint dwFlags   // WINHTTP_OPEN_REQUEST_FLAGS
);
ccall((:WinHttpOpenRequest, "WINHTTP.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, Cwstring, Cwstring, Cwstring, Cwstring, Ptr{Ptr{UInt16}}, UInt32),
      hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags)
# hConnect : void* in/out -> Ptr{Cvoid}
# pwszVerb : LPCWSTR -> Cwstring
# pwszObjectName : LPCWSTR -> Cwstring
# pwszVersion : LPCWSTR -> Cwstring
# pwszReferrer : LPCWSTR -> Cwstring
# ppwszAcceptTypes : LPCWSTR* -> Ptr{Ptr{UInt16}}
# dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* WinHttpOpenRequest(
    void* hConnect,
    const uint16_t* pwszVerb,
    const uint16_t* pwszObjectName,
    const uint16_t* pwszVersion,
    const uint16_t* pwszReferrer,
    uint16_t** ppwszAcceptTypes,
    uint32_t dwFlags);
]]
local winhttp = ffi.load("winhttp")
-- winhttp.WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags)
-- hConnect : void* in/out
-- pwszVerb : LPCWSTR
-- pwszObjectName : LPCWSTR
-- pwszVersion : LPCWSTR
-- pwszReferrer : LPCWSTR
-- ppwszAcceptTypes : LPCWSTR*
-- dwFlags : WINHTTP_OPEN_REQUEST_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WINHTTP.dll');
const WinHttpOpenRequest = lib.func('__stdcall', 'WinHttpOpenRequest', 'void *', ['void *', 'str16', 'str16', 'str16', 'str16', 'void *', 'uint32_t']);
// WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags)
// hConnect : void* in/out -> 'void *'
// pwszVerb : LPCWSTR -> 'str16'
// pwszObjectName : LPCWSTR -> 'str16'
// pwszVersion : LPCWSTR -> 'str16'
// pwszReferrer : LPCWSTR -> 'str16'
// ppwszAcceptTypes : LPCWSTR* -> 'void *'
// dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WINHTTP.dll", {
  WinHttpOpenRequest: { parameters: ["pointer", "buffer", "buffer", "buffer", "buffer", "pointer", "u32"], result: "pointer" },
});
// lib.symbols.WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags)
// hConnect : void* in/out -> "pointer"
// pwszVerb : LPCWSTR -> "buffer"
// pwszObjectName : LPCWSTR -> "buffer"
// pwszVersion : LPCWSTR -> "buffer"
// pwszReferrer : LPCWSTR -> "buffer"
// ppwszAcceptTypes : LPCWSTR* -> "pointer"
// dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* WinHttpOpenRequest(
    void* hConnect,
    const uint16_t* pwszVerb,
    const uint16_t* pwszObjectName,
    const uint16_t* pwszVersion,
    const uint16_t* pwszReferrer,
    uint16_t** ppwszAcceptTypes,
    uint32_t dwFlags);
C, "WINHTTP.dll");
// $ffi->WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, ppwszAcceptTypes, dwFlags);
// hConnect : void* in/out
// pwszVerb : LPCWSTR
// pwszObjectName : LPCWSTR
// pwszVersion : LPCWSTR
// pwszReferrer : LPCWSTR
// ppwszAcceptTypes : LPCWSTR*
// dwFlags : WINHTTP_OPEN_REQUEST_FLAGS
// 構造体/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);
    Pointer WinHttpOpenRequest(
        Pointer hConnect,   // void* in/out
        WString pwszVerb,   // LPCWSTR
        WString pwszObjectName,   // LPCWSTR
        WString pwszVersion,   // LPCWSTR
        WString pwszReferrer,   // LPCWSTR
        PointerByReference ppwszAcceptTypes,   // LPCWSTR*
        int dwFlags   // WINHTTP_OPEN_REQUEST_FLAGS
    );
}
@[Link("winhttp")]
lib LibWINHTTP
  fun WinHttpOpenRequest = WinHttpOpenRequest(
    hConnect : Void*,   # void* in/out
    pwszVerb : UInt16*,   # LPCWSTR
    pwszObjectName : UInt16*,   # LPCWSTR
    pwszVersion : UInt16*,   # LPCWSTR
    pwszReferrer : UInt16*,   # LPCWSTR
    ppwszAcceptTypes : UInt16**,   # LPCWSTR*
    dwFlags : UInt32   # WINHTTP_OPEN_REQUEST_FLAGS
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef WinHttpOpenRequestNative = Pointer<Void> Function(Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Pointer<Utf16>>, Uint32);
typedef WinHttpOpenRequestDart = Pointer<Void> Function(Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Pointer<Utf16>>, int);
final WinHttpOpenRequest = DynamicLibrary.open('WINHTTP.dll')
    .lookupFunction<WinHttpOpenRequestNative, WinHttpOpenRequestDart>('WinHttpOpenRequest');
// hConnect : void* in/out -> Pointer<Void>
// pwszVerb : LPCWSTR -> Pointer<Utf16>
// pwszObjectName : LPCWSTR -> Pointer<Utf16>
// pwszVersion : LPCWSTR -> Pointer<Utf16>
// pwszReferrer : LPCWSTR -> Pointer<Utf16>
// ppwszAcceptTypes : LPCWSTR* -> Pointer<Pointer<Utf16>>
// dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WinHttpOpenRequest(
  hConnect: Pointer;   // void* in/out
  pwszVerb: PWideChar;   // LPCWSTR
  pwszObjectName: PWideChar;   // LPCWSTR
  pwszVersion: PWideChar;   // LPCWSTR
  pwszReferrer: PWideChar;   // LPCWSTR
  ppwszAcceptTypes: PPWideChar;   // LPCWSTR*
  dwFlags: DWORD   // WINHTTP_OPEN_REQUEST_FLAGS
): Pointer; stdcall;
  external 'WINHTTP.dll' name 'WinHttpOpenRequest';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WinHttpOpenRequest"
  c_WinHttpOpenRequest :: Ptr () -> CWString -> CWString -> CWString -> CWString -> Ptr CWString -> Word32 -> IO (Ptr ())
-- hConnect : void* in/out -> Ptr ()
-- pwszVerb : LPCWSTR -> CWString
-- pwszObjectName : LPCWSTR -> CWString
-- pwszVersion : LPCWSTR -> CWString
-- pwszReferrer : LPCWSTR -> CWString
-- ppwszAcceptTypes : LPCWSTR* -> Ptr CWString
-- dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let winhttpopenrequest =
  foreign "WinHttpOpenRequest"
    ((ptr void) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr (ptr uint16_t)) @-> uint32_t @-> returning (ptr void))
(* hConnect : void* in/out -> (ptr void) *)
(* pwszVerb : LPCWSTR -> (ptr uint16_t) *)
(* pwszObjectName : LPCWSTR -> (ptr uint16_t) *)
(* pwszVersion : LPCWSTR -> (ptr uint16_t) *)
(* pwszReferrer : LPCWSTR -> (ptr uint16_t) *)
(* ppwszAcceptTypes : LPCWSTR* -> (ptr (ptr uint16_t)) *)
(* dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library winhttp (t "WINHTTP.dll"))
(cffi:use-foreign-library winhttp)

(cffi:defcfun ("WinHttpOpenRequest" win-http-open-request :convention :stdcall) :pointer
  (h-connect :pointer)   ; void* in/out
  (pwsz-verb (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-object-name (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-version (:string :encoding :utf-16le))   ; LPCWSTR
  (pwsz-referrer (:string :encoding :utf-16le))   ; LPCWSTR
  (ppwsz-accept-types :pointer)   ; LPCWSTR*
  (dw-flags :uint32))   ; WINHTTP_OPEN_REQUEST_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WinHttpOpenRequest = Win32::API::More->new('WINHTTP',
    'LPVOID WinHttpOpenRequest(LPVOID hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName, LPCWSTR pwszVersion, LPCWSTR pwszReferrer, LPVOID ppwszAcceptTypes, DWORD dwFlags)');
# my $ret = $WinHttpOpenRequest->Call($hConnect, $pwszVerb, $pwszObjectName, $pwszVersion, $pwszReferrer, $ppwszAcceptTypes, $dwFlags);
# hConnect : void* in/out -> LPVOID
# pwszVerb : LPCWSTR -> LPCWSTR
# pwszObjectName : LPCWSTR -> LPCWSTR
# pwszVersion : LPCWSTR -> LPCWSTR
# pwszReferrer : LPCWSTR -> LPCWSTR
# ppwszAcceptTypes : LPCWSTR* -> LPVOID
# dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型