Win32 API 日本語リファレンス
ホーム › NetworkManagement.WiFi › WlanGetNetworkBssList

WlanGetNetworkBssList

関数
指定SSIDの無線LAN BSS(基地局)一覧を取得する。
DLLwlanapi.dll呼出規約winapi対応OSWindows Vista 以降

シグネチャ

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

DWORD WlanGetNetworkBssList(
    HANDLE hClientHandle,
    const GUID* pInterfaceGuid,
    const DOT11_SSID* pDot11Ssid,   // optional
    DOT11_BSS_TYPE dot11BssType,
    BOOL bSecurityEnabled,
    void* pReserved,   // optional
    WLAN_BSS_LIST** ppWlanBssList
);

パラメーター

名前型方向説明
hClientHandleHANDLEinクライアントのセッションハンドル。事前に WlanOpenHandle 関数を呼び出して取得します。
pInterfaceGuidGUID*in

照会する無線 LAN インターフェイスの GUID へのポインター。

ローカルコンピューターで有効になっている各無線 LAN インターフェイスの GUID は、WlanEnumInterfaces 関数を使用して調べることができます。

pDot11SsidDOT11_SSID*inoptional

BSS 一覧の取得対象とするネットワークの SSID を指定する DOT11_SSID 構造体へのポインター。このパラメーターは省略可能です。NULL を指定した場合、返される一覧には無線 LAN インターフェイス上で利用可能なすべての BSS エントリが含まれます。

DOT11_SSID 構造体へのポインターを指定する場合、DOT11_SSID 構造体の uSSIDLength メンバーで指定する SSID の長さは、Wlantypes.h ヘッダーファイルで定義されている DOT11_SSID_MAX_LENGTH 以下である必要があります。さらに、dot11BssType パラメーターには dot11_BSS_type_infrastructure または dot11_BSS_type_independent のいずれかを設定し、bSecurityEnabled パラメーターを指定する必要があります。

dot11BssTypeDOT11_BSS_TYPEin

ネットワークの BSS 型。BSS 一覧の取得対象とするネットワークの SSID が指定されていない場合 (pDot11Ssid パラメーターが NULL の場合)、このパラメーターは無視されます。

このパラメーターには、Wlantypes.h ヘッダーファイルで定義されている DOT11_BSS_TYPE 列挙型で定義された次の値のいずれかを指定できます。

値 意味
dot11_BSS_type_infrastructure
インフラストラクチャ BSS ネットワーク。
dot11_BSS_type_independent
独立 BSS (IBSS) ネットワーク (アドホックネットワーク)。
dot11_BSS_type_any
任意の BSS ネットワーク。
bSecurityEnabledBOOLinネットワークでセキュリティが有効になっているかどうかを示す値。このパラメーターは、BSS 一覧の取得対象とするネットワークの SSID が指定されている場合 (pDot11Ssid パラメーターが NULL でない場合) にのみ有効です。
pReservedvoid*optional将来の使用のために予約されています。このパラメーターは NULL に設定する必要があります。
ppWlanBssListWLAN_BSS_LIST**out

返される BSS エントリの一覧を WLAN_BSS_LIST 構造体で受け取るためのポインターを格納する領域へのポインター。

返される WLAN_BSS_LIST 用のバッファーは、呼び出しが成功した場合に WlanGetNetworkBssList 関数によって割り当てられます。

戻り値の型: DWORD

公式ドキュメント

指定した無線 LAN インターフェイス上の無線ネットワークの Basic Service Set (BSS) エントリの一覧を取得します。

戻り値

関数が成功した場合、戻り値は ERROR_SUCCESS です。

関数が失敗した場合、戻り値は次のいずれかのリターンコードになります。

リターンコード 説明
ERROR_INVALID_HANDLE
ハンドル hClientHandle がハンドルテーブル内に見つかりませんでした。
ERROR_INVALID_PARAMETER
パラメーターが正しくありません。このエラーは、hClientHandle、pInterfaceGuid、または ppWlanBssList パラメーターが NULL の場合に返されます。また、pReserved が NULL でない場合にも返されます。さらに、hClientHandle、pDot11Ssid パラメーターで指定された SSID、または dot11BssType パラメーターで指定された BSS 型が有効でない場合にも返されます。
ERROR_NDIS_DOT11_POWER_STATE_INVALID
インターフェイスに関連付けられた無線がオフになっています。無線がオフの間は BSS 一覧を利用できません。
ERROR_NOT_ENOUGH_MEMORY
この要求を処理し、クエリ結果用のメモリを割り当てるのに十分なメモリがありません。
ERROR_NOT_FOUND
要素が見つかりませんでした。このエラーは、pInterfaceGuid パラメーターで指定された、照会対象のインターフェイスの GUID が見つからなかった場合に返されます。
ERROR_NOT_SUPPORTED
要求はサポートされていません。このエラーは、この関数が Windows XP with SP3 のクライアント、または Wireless LAN API for Windows XP with SP2 のクライアントから呼び出された場合に返されます。また、WLAN AutoConfig サービスが無効になっている場合にも返されます。
ERROR_SERVICE_NOT_ACTIVE
WLAN AutoConfig サービスが開始されていません。
RPC_STATUS
さまざまなエラーコード。

解説(Remarks)

WlanGetNetworkBssList 関数は、指定したインターフェイスでアクセスできる各無線ネットワークの Basic Service Set 一覧を取得します。各無線ネットワークについて返される情報には、インフラストラクチャ BSS ネットワークの場合は各アクセスポイントが、独立 BSS ネットワーク (アドホックネットワーク) の場合は各ネットワークピアが返す情報要素の一覧も含まれます。情報は、ppWlanBssList パラメーターに WLAN_BSS_LIST 構造体へのポインターとして返されます。WLAN_BSS_LIST 構造体には項目数と、それに続く WLAN_BSS_ENTRY 構造体エントリの配列が含まれます。

WlanGetNetworkBssList 関数が返す情報は、インフラストラクチャ BSS ネットワークではアクセスポイントから、独立 BSS ネットワーク (アドホックネットワーク) ではネットワークピアから送信されたものであるため、返される情報を信頼すべきではありません。WLAN_BSS_ENTRY 構造体内の情報要素データ BLOB のサイズを判断するには、情報要素データ BLOB 自体のデータではなく、WLAN_BSS_ENTRY 構造体の ulIeOffset メンバーおよび ulIeSize メンバーを使用してください。WlanGetNetworkBssList 関数は、ulIeOffset メンバーが指す情報要素データ BLOB に返される情報が、無線 LAN に関する IEEE 802.11 標準で定義された有効な情報要素であるかどうかを検証しません。

pDot11Ssid パラメーターを指定する場合 (NULL でない場合)、dot11BssType パラメーターには、インフラストラクチャ BSS ネットワークであれば dot11_BSS_type_infrastructure を、独立 BSS ネットワーク (アドホックネットワーク) であれば dot11_BSS_type_independent を設定する必要があります。dot11BssType パラメーターに dot11_BSS_type_any を設定した場合、WlanGetNetworkBssList 関数は ERROR_SUCCESS を返しますが、BSS エントリは返されません。

無線 LAN インターフェイス上のすべてのインフラストラクチャ BSS ネットワークおよび独立 BSS ネットワーク (アドホックネットワーク) の一覧を返すには、pDot11Ssid パラメーターを NULL に設定します。無線 LAN インターフェイスがワイヤレス ホステッド ネットワークとしても動作している場合、BSS 一覧にはワイヤレス ホステッド ネットワーク用に作成された BSS のエントリが含まれます。

WlanGetNetworkBssList 関数は、WLAN AutoConfig サービスが空の BSS 一覧を返した場合にも ERROR_SUCCESS を返します。WlanGetNetworkBssList 関数を呼び出すアプリケーションは、WLAN_BSS_LIST 構造体の wlanBssEntries[0] メンバーにアクセスする前に、ppWlanBssList パラメーターが指す WLAN_BSS_LIST の dwNumberOfItems メンバーが 0 でないことを確認する必要があります。

WlanGetNetworkBssList 関数は、成功した場合、ppWlanBssList パラメーターが指すバッファーで返される Basic Service Set 一覧用のメモリを割り当てます。ppWlanBssList パラメーターが指すバッファーに使用されたメモリは、そのバッファーが不要になった時点で WlanFreeMemory 関数を呼び出して解放してください。

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

各言語での呼び出し定義

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

DWORD WlanGetNetworkBssList(
    HANDLE hClientHandle,
    const GUID* pInterfaceGuid,
    const DOT11_SSID* pDot11Ssid,   // optional
    DOT11_BSS_TYPE dot11BssType,
    BOOL bSecurityEnabled,
    void* pReserved,   // optional
    WLAN_BSS_LIST** ppWlanBssList
);
[DllImport("wlanapi.dll", ExactSpelling = true)]
static extern uint WlanGetNetworkBssList(
    IntPtr hClientHandle,   // HANDLE
    ref Guid pInterfaceGuid,   // GUID*
    IntPtr pDot11Ssid,   // DOT11_SSID* optional
    int dot11BssType,   // DOT11_BSS_TYPE
    bool bSecurityEnabled,   // BOOL
    IntPtr pReserved,   // void* optional
    IntPtr ppWlanBssList   // WLAN_BSS_LIST** out
);
<DllImport("wlanapi.dll", ExactSpelling:=True)>
Public Shared Function WlanGetNetworkBssList(
    hClientHandle As IntPtr,   ' HANDLE
    ByRef pInterfaceGuid As Guid,   ' GUID*
    pDot11Ssid As IntPtr,   ' DOT11_SSID* optional
    dot11BssType As Integer,   ' DOT11_BSS_TYPE
    bSecurityEnabled As Boolean,   ' BOOL
    pReserved As IntPtr,   ' void* optional
    ppWlanBssList As IntPtr   ' WLAN_BSS_LIST** out
) As UInteger
End Function
' hClientHandle : HANDLE
' pInterfaceGuid : GUID*
' pDot11Ssid : DOT11_SSID* optional
' dot11BssType : DOT11_BSS_TYPE
' bSecurityEnabled : BOOL
' pReserved : void* optional
' ppWlanBssList : WLAN_BSS_LIST** out
Declare PtrSafe Function WlanGetNetworkBssList Lib "wlanapi" ( _
    ByVal hClientHandle As LongPtr, _
    ByVal pInterfaceGuid As LongPtr, _
    ByVal pDot11Ssid As LongPtr, _
    ByVal dot11BssType As Long, _
    ByVal bSecurityEnabled As Long, _
    ByVal pReserved As LongPtr, _
    ByVal ppWlanBssList As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

WlanGetNetworkBssList = ctypes.windll.wlanapi.WlanGetNetworkBssList
WlanGetNetworkBssList.restype = wintypes.DWORD
WlanGetNetworkBssList.argtypes = [
    wintypes.HANDLE,  # hClientHandle : HANDLE
    ctypes.c_void_p,  # pInterfaceGuid : GUID*
    ctypes.c_void_p,  # pDot11Ssid : DOT11_SSID* optional
    ctypes.c_int,  # dot11BssType : DOT11_BSS_TYPE
    wintypes.BOOL,  # bSecurityEnabled : BOOL
    ctypes.POINTER(None),  # pReserved : void* optional
    ctypes.c_void_p,  # ppWlanBssList : WLAN_BSS_LIST** out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('wlanapi.dll')
WlanGetNetworkBssList = Fiddle::Function.new(
  lib['WlanGetNetworkBssList'],
  [
    Fiddle::TYPE_VOIDP,  # hClientHandle : HANDLE
    Fiddle::TYPE_VOIDP,  # pInterfaceGuid : GUID*
    Fiddle::TYPE_VOIDP,  # pDot11Ssid : DOT11_SSID* optional
    Fiddle::TYPE_INT,  # dot11BssType : DOT11_BSS_TYPE
    Fiddle::TYPE_INT,  # bSecurityEnabled : BOOL
    Fiddle::TYPE_VOIDP,  # pReserved : void* optional
    Fiddle::TYPE_VOIDP,  # ppWlanBssList : WLAN_BSS_LIST** out
  ],
  -Fiddle::TYPE_INT)
#[link(name = "wlanapi")]
extern "system" {
    fn WlanGetNetworkBssList(
        hClientHandle: *mut core::ffi::c_void,  // HANDLE
        pInterfaceGuid: *const GUID,  // GUID*
        pDot11Ssid: *const DOT11_SSID,  // DOT11_SSID* optional
        dot11BssType: i32,  // DOT11_BSS_TYPE
        bSecurityEnabled: i32,  // BOOL
        pReserved: *mut (),  // void* optional
        ppWlanBssList: *mut *mut WLAN_BSS_LIST  // WLAN_BSS_LIST** out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("wlanapi.dll")]
public static extern uint WlanGetNetworkBssList(IntPtr hClientHandle, ref Guid pInterfaceGuid, IntPtr pDot11Ssid, int dot11BssType, bool bSecurityEnabled, IntPtr pReserved, IntPtr ppWlanBssList);
"@
$api = Add-Type -MemberDefinition $sig -Name 'wlanapi_WlanGetNetworkBssList' -Namespace Win32 -PassThru
# $api::WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
#uselib "wlanapi.dll"
#func global WlanGetNetworkBssList "WlanGetNetworkBssList" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; WlanGetNetworkBssList hClientHandle, varptr(pInterfaceGuid), varptr(pDot11Ssid), dot11BssType, bSecurityEnabled, pReserved, varptr(ppWlanBssList)   ; 戻り値は stat
; hClientHandle : HANDLE -> "sptr"
; pInterfaceGuid : GUID* -> "sptr"
; pDot11Ssid : DOT11_SSID* optional -> "sptr"
; dot11BssType : DOT11_BSS_TYPE -> "sptr"
; bSecurityEnabled : BOOL -> "sptr"
; pReserved : void* optional -> "sptr"
; ppWlanBssList : WLAN_BSS_LIST** out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "wlanapi.dll"
#cfunc global WlanGetNetworkBssList "WlanGetNetworkBssList" sptr, var, var, int, int, sptr, var
; res = WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
; hClientHandle : HANDLE -> "sptr"
; pInterfaceGuid : GUID* -> "var"
; pDot11Ssid : DOT11_SSID* optional -> "var"
; dot11BssType : DOT11_BSS_TYPE -> "int"
; bSecurityEnabled : BOOL -> "int"
; pReserved : void* optional -> "sptr"
; ppWlanBssList : WLAN_BSS_LIST** out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD WlanGetNetworkBssList(HANDLE hClientHandle, GUID* pInterfaceGuid, DOT11_SSID* pDot11Ssid, DOT11_BSS_TYPE dot11BssType, BOOL bSecurityEnabled, void* pReserved, WLAN_BSS_LIST** ppWlanBssList)
#uselib "wlanapi.dll"
#cfunc global WlanGetNetworkBssList "WlanGetNetworkBssList" intptr, var, var, int, int, intptr, var
; res = WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
; hClientHandle : HANDLE -> "intptr"
; pInterfaceGuid : GUID* -> "var"
; pDot11Ssid : DOT11_SSID* optional -> "var"
; dot11BssType : DOT11_BSS_TYPE -> "int"
; bSecurityEnabled : BOOL -> "int"
; pReserved : void* optional -> "intptr"
; ppWlanBssList : WLAN_BSS_LIST** out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	wlanapi = windows.NewLazySystemDLL("wlanapi.dll")
	procWlanGetNetworkBssList = wlanapi.NewProc("WlanGetNetworkBssList")
)

// hClientHandle (HANDLE), pInterfaceGuid (GUID*), pDot11Ssid (DOT11_SSID* optional), dot11BssType (DOT11_BSS_TYPE), bSecurityEnabled (BOOL), pReserved (void* optional), ppWlanBssList (WLAN_BSS_LIST** out)
r1, _, err := procWlanGetNetworkBssList.Call(
	uintptr(hClientHandle),
	uintptr(pInterfaceGuid),
	uintptr(pDot11Ssid),
	uintptr(dot11BssType),
	uintptr(bSecurityEnabled),
	uintptr(pReserved),
	uintptr(ppWlanBssList),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function WlanGetNetworkBssList(
  hClientHandle: THandle;   // HANDLE
  pInterfaceGuid: PGUID;   // GUID*
  pDot11Ssid: Pointer;   // DOT11_SSID* optional
  dot11BssType: Integer;   // DOT11_BSS_TYPE
  bSecurityEnabled: BOOL;   // BOOL
  pReserved: Pointer;   // void* optional
  ppWlanBssList: Pointer   // WLAN_BSS_LIST** out
): DWORD; stdcall;
  external 'wlanapi.dll' name 'WlanGetNetworkBssList';
result := DllCall("wlanapi\WlanGetNetworkBssList"
    , "Ptr", hClientHandle   ; HANDLE
    , "Ptr", pInterfaceGuid   ; GUID*
    , "Ptr", pDot11Ssid   ; DOT11_SSID* optional
    , "Int", dot11BssType   ; DOT11_BSS_TYPE
    , "Int", bSecurityEnabled   ; BOOL
    , "Ptr", pReserved   ; void* optional
    , "Ptr", ppWlanBssList   ; WLAN_BSS_LIST** out
    , "UInt")   ; return: DWORD
●WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList) = DLL("wlanapi.dll", "dword WlanGetNetworkBssList(void*, void*, void*, int, bool, void*, void*)")
# 呼び出し: WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
# hClientHandle : HANDLE -> "void*"
# pInterfaceGuid : GUID* -> "void*"
# pDot11Ssid : DOT11_SSID* optional -> "void*"
# dot11BssType : DOT11_BSS_TYPE -> "int"
# bSecurityEnabled : BOOL -> "bool"
# pReserved : void* optional -> "void*"
# ppWlanBssList : WLAN_BSS_LIST** out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "wlanapi" fn WlanGetNetworkBssList(
    hClientHandle: ?*anyopaque, // HANDLE
    pInterfaceGuid: [*c]GUID, // GUID*
    pDot11Ssid: [*c]DOT11_SSID, // DOT11_SSID* optional
    dot11BssType: i32, // DOT11_BSS_TYPE
    bSecurityEnabled: i32, // BOOL
    pReserved: ?*anyopaque, // void* optional
    ppWlanBssList: [*c][*c]WLAN_BSS_LIST // WLAN_BSS_LIST** out
) callconv(std.os.windows.WINAPI) u32;
proc WlanGetNetworkBssList(
    hClientHandle: pointer,  # HANDLE
    pInterfaceGuid: ptr GUID,  # GUID*
    pDot11Ssid: ptr DOT11_SSID,  # DOT11_SSID* optional
    dot11BssType: int32,  # DOT11_BSS_TYPE
    bSecurityEnabled: int32,  # BOOL
    pReserved: pointer,  # void* optional
    ppWlanBssList: ptr WLAN_BSS_LIST  # WLAN_BSS_LIST** out
): uint32 {.importc: "WlanGetNetworkBssList", stdcall, dynlib: "wlanapi.dll".}
pragma(lib, "wlanapi");
extern(Windows)
uint WlanGetNetworkBssList(
    void* hClientHandle,   // HANDLE
    GUID* pInterfaceGuid,   // GUID*
    DOT11_SSID* pDot11Ssid,   // DOT11_SSID* optional
    int dot11BssType,   // DOT11_BSS_TYPE
    int bSecurityEnabled,   // BOOL
    void* pReserved,   // void* optional
    WLAN_BSS_LIST** ppWlanBssList   // WLAN_BSS_LIST** out
);
ccall((:WlanGetNetworkBssList, "wlanapi.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, Ptr{GUID}, Ptr{DOT11_SSID}, Int32, Int32, Ptr{Cvoid}, Ptr{WLAN_BSS_LIST}),
      hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
# hClientHandle : HANDLE -> Ptr{Cvoid}
# pInterfaceGuid : GUID* -> Ptr{GUID}
# pDot11Ssid : DOT11_SSID* optional -> Ptr{DOT11_SSID}
# dot11BssType : DOT11_BSS_TYPE -> Int32
# bSecurityEnabled : BOOL -> Int32
# pReserved : void* optional -> Ptr{Cvoid}
# ppWlanBssList : WLAN_BSS_LIST** out -> Ptr{WLAN_BSS_LIST}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t WlanGetNetworkBssList(
    void* hClientHandle,
    void* pInterfaceGuid,
    void* pDot11Ssid,
    int32_t dot11BssType,
    int32_t bSecurityEnabled,
    void* pReserved,
    void* ppWlanBssList);
]]
local wlanapi = ffi.load("wlanapi")
-- wlanapi.WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
-- hClientHandle : HANDLE
-- pInterfaceGuid : GUID*
-- pDot11Ssid : DOT11_SSID* optional
-- dot11BssType : DOT11_BSS_TYPE
-- bSecurityEnabled : BOOL
-- pReserved : void* optional
-- ppWlanBssList : WLAN_BSS_LIST** out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('wlanapi.dll');
const WlanGetNetworkBssList = lib.func('__stdcall', 'WlanGetNetworkBssList', 'uint32_t', ['void *', 'void *', 'void *', 'int32_t', 'int32_t', 'void *', 'void *']);
// WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
// hClientHandle : HANDLE -> 'void *'
// pInterfaceGuid : GUID* -> 'void *'
// pDot11Ssid : DOT11_SSID* optional -> 'void *'
// dot11BssType : DOT11_BSS_TYPE -> 'int32_t'
// bSecurityEnabled : BOOL -> 'int32_t'
// pReserved : void* optional -> 'void *'
// ppWlanBssList : WLAN_BSS_LIST** out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("wlanapi.dll", {
  WlanGetNetworkBssList: { parameters: ["pointer", "pointer", "pointer", "i32", "i32", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList)
// hClientHandle : HANDLE -> "pointer"
// pInterfaceGuid : GUID* -> "pointer"
// pDot11Ssid : DOT11_SSID* optional -> "pointer"
// dot11BssType : DOT11_BSS_TYPE -> "i32"
// bSecurityEnabled : BOOL -> "i32"
// pReserved : void* optional -> "pointer"
// ppWlanBssList : WLAN_BSS_LIST** out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t WlanGetNetworkBssList(
    void* hClientHandle,
    void* pInterfaceGuid,
    void* pDot11Ssid,
    int32_t dot11BssType,
    int32_t bSecurityEnabled,
    void* pReserved,
    void* ppWlanBssList);
C, "wlanapi.dll");
// $ffi->WlanGetNetworkBssList(hClientHandle, pInterfaceGuid, pDot11Ssid, dot11BssType, bSecurityEnabled, pReserved, ppWlanBssList);
// hClientHandle : HANDLE
// pInterfaceGuid : GUID*
// pDot11Ssid : DOT11_SSID* optional
// dot11BssType : DOT11_BSS_TYPE
// bSecurityEnabled : BOOL
// pReserved : void* optional
// ppWlanBssList : WLAN_BSS_LIST** 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 Wlanapi extends StdCallLibrary {
    Wlanapi INSTANCE = Native.load("wlanapi", Wlanapi.class);
    int WlanGetNetworkBssList(
        Pointer hClientHandle,   // HANDLE
        Pointer pInterfaceGuid,   // GUID*
        Pointer pDot11Ssid,   // DOT11_SSID* optional
        int dot11BssType,   // DOT11_BSS_TYPE
        boolean bSecurityEnabled,   // BOOL
        Pointer pReserved,   // void* optional
        Pointer ppWlanBssList   // WLAN_BSS_LIST** out
    );
}
@[Link("wlanapi")]
lib Libwlanapi
  fun WlanGetNetworkBssList = WlanGetNetworkBssList(
    hClientHandle : Void*,   # HANDLE
    pInterfaceGuid : GUID*,   # GUID*
    pDot11Ssid : DOT11_SSID*,   # DOT11_SSID* optional
    dot11BssType : Int32,   # DOT11_BSS_TYPE
    bSecurityEnabled : Int32,   # BOOL
    pReserved : Void*,   # void* optional
    ppWlanBssList : WLAN_BSS_LIST**   # WLAN_BSS_LIST** out
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef WlanGetNetworkBssListNative = Uint32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Int32, Int32, Pointer<Void>, Pointer<Void>);
typedef WlanGetNetworkBssListDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, int, int, Pointer<Void>, Pointer<Void>);
final WlanGetNetworkBssList = DynamicLibrary.open('wlanapi.dll')
    .lookupFunction<WlanGetNetworkBssListNative, WlanGetNetworkBssListDart>('WlanGetNetworkBssList');
// hClientHandle : HANDLE -> Pointer<Void>
// pInterfaceGuid : GUID* -> Pointer<Void>
// pDot11Ssid : DOT11_SSID* optional -> Pointer<Void>
// dot11BssType : DOT11_BSS_TYPE -> Int32
// bSecurityEnabled : BOOL -> Int32
// pReserved : void* optional -> Pointer<Void>
// ppWlanBssList : WLAN_BSS_LIST** out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WlanGetNetworkBssList(
  hClientHandle: THandle;   // HANDLE
  pInterfaceGuid: PGUID;   // GUID*
  pDot11Ssid: Pointer;   // DOT11_SSID* optional
  dot11BssType: Integer;   // DOT11_BSS_TYPE
  bSecurityEnabled: BOOL;   // BOOL
  pReserved: Pointer;   // void* optional
  ppWlanBssList: Pointer   // WLAN_BSS_LIST** out
): DWORD; stdcall;
  external 'wlanapi.dll' name 'WlanGetNetworkBssList';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WlanGetNetworkBssList"
  c_WlanGetNetworkBssList :: Ptr () -> Ptr () -> Ptr () -> Int32 -> CInt -> Ptr () -> Ptr () -> IO Word32
-- hClientHandle : HANDLE -> Ptr ()
-- pInterfaceGuid : GUID* -> Ptr ()
-- pDot11Ssid : DOT11_SSID* optional -> Ptr ()
-- dot11BssType : DOT11_BSS_TYPE -> Int32
-- bSecurityEnabled : BOOL -> CInt
-- pReserved : void* optional -> Ptr ()
-- ppWlanBssList : WLAN_BSS_LIST** out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let wlangetnetworkbsslist =
  foreign "WlanGetNetworkBssList"
    ((ptr void) @-> (ptr void) @-> (ptr void) @-> int32_t @-> int32_t @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* hClientHandle : HANDLE -> (ptr void) *)
(* pInterfaceGuid : GUID* -> (ptr void) *)
(* pDot11Ssid : DOT11_SSID* optional -> (ptr void) *)
(* dot11BssType : DOT11_BSS_TYPE -> int32_t *)
(* bSecurityEnabled : BOOL -> int32_t *)
(* pReserved : void* optional -> (ptr void) *)
(* ppWlanBssList : WLAN_BSS_LIST** out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library wlanapi (t "wlanapi.dll"))
(cffi:use-foreign-library wlanapi)

(cffi:defcfun ("WlanGetNetworkBssList" wlan-get-network-bss-list :convention :stdcall) :uint32
  (h-client-handle :pointer)   ; HANDLE
  (p-interface-guid :pointer)   ; GUID*
  (p-dot11-ssid :pointer)   ; DOT11_SSID* optional
  (dot11-bss-type :int32)   ; DOT11_BSS_TYPE
  (b-security-enabled :int32)   ; BOOL
  (p-reserved :pointer)   ; void* optional
  (pp-wlan-bss-list :pointer))   ; WLAN_BSS_LIST** out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WlanGetNetworkBssList = Win32::API::More->new('wlanapi',
    'DWORD WlanGetNetworkBssList(HANDLE hClientHandle, LPVOID pInterfaceGuid, LPVOID pDot11Ssid, int dot11BssType, BOOL bSecurityEnabled, LPVOID pReserved, LPVOID ppWlanBssList)');
# my $ret = $WlanGetNetworkBssList->Call($hClientHandle, $pInterfaceGuid, $pDot11Ssid, $dot11BssType, $bSecurityEnabled, $pReserved, $ppWlanBssList);
# hClientHandle : HANDLE -> HANDLE
# pInterfaceGuid : GUID* -> LPVOID
# pDot11Ssid : DOT11_SSID* optional -> LPVOID
# dot11BssType : DOT11_BSS_TYPE -> int
# bSecurityEnabled : BOOL -> BOOL
# pReserved : void* optional -> LPVOID
# ppWlanBssList : WLAN_BSS_LIST** out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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