WinHttpOpenRequest
関数シグネチャ
// WINHTTP.dll
#include <windows.h>
void* WinHttpOpenRequest(
void* hConnect,
LPCWSTR pwszVerb,
LPCWSTR pwszObjectName,
LPCWSTR pwszVersion,
LPCWSTR pwszReferrer,
LPCWSTR* ppwszAcceptTypes,
WINHTTP_OPEN_REQUEST_FLAGS dwFlags
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hConnect | void* | inout | HINTERNET 形式の、 WinHttpConnect によって返された HTTP セッションへの接続ハンドルです。 | ||||||||||||||||
| pwszVerb | LPCWSTR | in | リクエストで使用する HTTP 動詞 を含む文字列へのポインターです。このパラメーターが NULL の場合、関数は HTTP 動詞 として GET を使用します。注意 この文字列はすべて大文字にしてください。多くのサーバーは HTTP 動詞を大文字と小文字を区別して扱い、Internet Engineering Task Force (IETF) の Requests for Comments (RFC) ではこれらの動詞を大文字のみで表記しています。 | ||||||||||||||||
| pwszObjectName | LPCWSTR | in | 指定した HTTP 動詞の対象リソース名を含む null 終端文字列へのポインターです。これは通常、ファイル名、実行可能モジュール、または検索指定子です。 | ||||||||||||||||
| pwszVersion | LPCWSTR | in | HTTP バージョンを含む文字列へのポインターです。このパラメーターが NULL の場合、関数は HTTP/1.1 を使用します。 | ||||||||||||||||
| pwszReferrer | LPCWSTR | in | リクエスト内の pwszObjectName の URL を取得した元のドキュメントの URL を指定する文字列へのポインターです。このパラメーターが WINHTTP_NO_REFERER に設定されている場合、参照元ドキュメントは指定されません。 | ||||||||||||||||
| ppwszAcceptTypes | LPCWSTR* | in | クライアントが受け入れるメディアタイプを指定する文字列ポインターの null 終端配列へのポインターです。このパラメーターが WINHTTP_DEFAULT_ACCEPT_TYPES に設定されている場合、クライアントは一切のタイプを受け入れません。通常、サーバーは受け入れ可能なタイプが指定されていない場合、クライアントが "text/*" 型のドキュメントのみ、つまりテキストドキュメントのみを受け入れ、画像やその他のバイナリファイルは受け入れないものとして扱います。有効なメディアタイプの一覧については、IANA が定義する Media Types (http://www.iana.org/assignments/media-types/) を参照してください。 | ||||||||||||||||
| dwFlags | WINHTTP_OPEN_REQUEST_FLAGS | in | Internet フラグ値を含む符号なしロング整数値です。次の値のうち 1 つ以上を指定できます。
|
戻り値の型: void*
公式ドキュメント
WinHttpOpenRequest 関数は、HTTP リクエストハンドルを作成します。
戻り値
成功した場合は有効な HTTP リクエストハンドルを、失敗した場合は NULL を返します。拡張エラー情報を取得するには、 GetLastError を呼び出します。返されるエラーコードには次のものがあります。
| エラーコード | 説明 |
|---|---|
| 指定されたハンドルの種類がこの操作に対して正しくありません。 | |
| 内部エラーが発生しました。 | |
| URL が無効です。 | |
| 操作がキャンセルされました。通常、これはリクエストが処理していたハンドルが操作完了前に閉じられたために発生します。 | |
| URL に "http:" または "https:" 以外のスキームが指定されました。 | |
| 要求された操作を完了するのに十分なメモリがありませんでした。(Windows エラーコード) |
解説(Remarks)
戻り値は成功または失敗を示します。拡張エラー情報を取得するには、 GetLastError を呼び出します。
WinHttpOpenRequest 関数は、新しい HTTP リクエストハンドルを作成し、指定されたパラメーターをそのハンドルに格納します。HTTP リクエストハンドルは、HTTP サーバーへ送信するリクエストを保持し、リクエストの一部として送信されるすべての RFC822/MIME/HTTP ヘッダーを含みます。
pwszVerb が "HEAD" に設定されている場合、Content-Length ヘッダーは無視されます。
ステータスコールバック関数が WinHttpSetStatusCallback でインストールされている場合、WINHTTP_CALLBACK_STATUS_HANDLE_CREATED 通知は WinHttpOpenRequest がリクエストハンドルを作成したことを示します。
呼び出し元のアプリケーションが WinHttpOpenRequest によって返された HINTERNET ハンドルの使用を終えた後は、 WinHttpCloseHandle 関数を使用してそれを閉じる必要があります。
例
この例では、 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 公式リファレンス: 英語 (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 方式にも切替可。#uselib "WINHTTP.dll" #cfunc global WinHttpOpenRequest "WinHttpOpenRequest" sptr, wstr, wstr, wstr, wstr, sptr, int ; res = WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, varptr(ppwszAcceptTypes), dwFlags) ; hConnect : void* in/out -> "sptr" ; pwszVerb : LPCWSTR -> "wstr" ; pwszObjectName : LPCWSTR -> "wstr" ; pwszVersion : LPCWSTR -> "wstr" ; pwszReferrer : LPCWSTR -> "wstr" ; ppwszAcceptTypes : LPCWSTR* -> "sptr" ; dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> "int" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, int ; res = WinHttpOpenRequest(hConnect, pwszVerb, pwszObjectName, pwszVersion, pwszReferrer, varptr(ppwszAcceptTypes), dwFlags) ; hConnect : void* in/out -> "intptr" ; pwszVerb : LPCWSTR -> "wstr" ; pwszObjectName : LPCWSTR -> "wstr" ; pwszVersion : LPCWSTR -> "wstr" ; pwszReferrer : LPCWSTR -> "wstr" ; ppwszAcceptTypes : LPCWSTR* -> "intptr" ; dwFlags : WINHTTP_OPEN_REQUEST_FLAGS -> "int" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 を使用。関連項目
- f WinHttpConnect — 指定サーバーへの接続を確立し接続ハンドルを返す。
- f WinHttpOpen — WinHTTPセッションを初期化しセッションハンドルを返す。