WNetOpenEnumA
関数シグネチャ
// MPR.dll (ANSI / -A)
#include <windows.h>
WIN32_ERROR WNetOpenEnumA(
NET_RESOURCE_SCOPE dwScope,
NET_RESOURCE_TYPE dwType,
WNET_OPEN_ENUM_USAGE dwUsage,
NETRESOURCEA* lpNetResource, // optional
HANDLE* lphEnum
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwScope | NET_RESOURCE_SCOPE | in | 列挙のスコープ。このパラメーターには、次のいずれかの値を指定できます。 | ||||||||||||
| dwType | NET_RESOURCE_TYPE | in | 列挙するリソースの種類。このパラメーターには、次の値の組み合わせを指定できます。
ネットワークプロバイダーが印刷リソースとディスクリソースを区別できない場合は、すべてのリソースを列挙することがあります。 | ||||||||||||
| dwUsage | WNET_OPEN_ENUM_USAGE | in | 列挙するリソースの使用種別。このパラメーターには、次の値の組み合わせを指定できます。
このパラメーターは、dwScope パラメーターが RESOURCE_GLOBALNET と等しい場合を除いて無視されます。詳しくは、後述の「解説」セクションを参照してください。 | ||||||||||||
| lpNetResource | NETRESOURCEA* | inoptional | 列挙するコンテナーを指定する NETRESOURCE 構造体へのポインター。dwScope パラメーターが RESOURCE_GLOBALNET でない場合、このパラメーターは NULL でなければなりません。 このパラメーターが NULL の場合は、ネットワークのルートが想定されます。(システムはネットワークを階層として構成します。ルートはネットワーク内で最上位のコンテナーです。) このパラメーターが NULL でない場合は、 NETRESOURCE 構造体を指している必要があります。この構造体は、アプリケーションが値を設定することも、 WNetEnumResource 関数の呼び出しによって返されたものを使用することもできます。 NETRESOURCE 構造体はコンテナーリソースを指定しなければなりません。つまり、dwUsage メンバーに RESOURCEUSAGE_CONTAINER 値を指定する必要があります。 すべてのネットワークリソースを列挙するには、アプリケーションは lpNetResource パラメーターを NULL に設定して WNetOpenEnum を呼び出すことで列挙を開始し、返されたハンドルを使用して WNetEnumResource を呼び出し、リソースを列挙します。 WNetEnumResource 関数が返す NETRESOURCE 配列内のリソースのいずれかがコンテナーリソースである場合は、 WNetOpenEnum を呼び出してそのリソースを開き、さらに列挙を進めることができます。 | ||||||||||||
| lphEnum | HANDLE* | out | 後続の WNetEnumResource の呼び出しで使用できる列挙ハンドルへのポインター。 |
戻り値の型: WIN32_ERROR
公式ドキュメント
WNetOpenEnum 関数は、ネットワークリソースまたは既存の接続の列挙を開始します。WNetEnumResource 関数を呼び出すことで列挙を継続できます。(ANSI)
戻り値
関数が成功すると、戻り値は NO_ERROR です。
関数が失敗すると、戻り値は次のいずれかのような システムエラーコード です。
| リターンコード | 説明 |
|---|---|
| lpNetResource パラメーターがコンテナーを指していません。 | |
| dwScope または dwType パラメーターが無効であるか、パラメーターの組み合わせが無効です。 | |
| ネットワークが利用できません。 | |
| ネットワーク固有のエラーが発生しました。エラーの説明を取得するには、 WNetGetLastError 関数を呼び出します。 | |
| NETRESOURCE 構造体で指定されたリモートネットワークリソース名が、無効なネットワークアドレスに解決されました。 |
解説(Remarks)
dwScope パラメーターが RESOURCE_CONNECTED と等しい場合、Microsoft LAN Manager ネットワークを使用して行われたネットワーク接続は、その接続を行ったアプリケーションが WNetOpenEnum 関数を呼び出すアプリケーションとは異なるログオンセッションで実行されていたときには、列挙から除外されます。これは、Microsoft LAN Manager を使用して行われた接続が、その接続を行ったアプリケーションと同じログオンセッションで実行されているアプリケーションからのみ参照できるためです。(接続を列挙に含めるには、アプリケーションがその接続を作成したユーザーアカウントで実行されているだけでは不十分です。)
dwScope パラメーターにおける RESOURCE_CONTEXT の正確な解釈は、そのマシンにインストールされているネットワークによって異なります。
WNetOpenEnum 関数は、単一のコンテナー内のリソースの列挙を開始するために使用します。次の例は、Microsoft LAN Manager ネットワークと Novell NetWare ネットワークの階層構造を示し、コンテナーを明示しています。
LanMan (コンテナー。この場合はプロバイダー)
ACCOUNTING (コンテナー。この場合はドメイン)
\\ACCTSPAY (コンテナー。この場合はサーバー)
PAYFILES (ディスク)
LASERJET (印刷)
NetWare (コンテナー。この場合はプロバイダー)
MARKETING (コンテナー。この場合はサーバー)
SYS (ディスク。NetWare サーバー上の最初のもの)
ANOTHERVOLUME (ディスク)
LASERJET (印刷)
例
ネットワーク上のすべてのリソースを列挙するアプリケーション定義の関数を示すコードサンプルについては、 Enumerating Network Resources を参照してください。
winnetwk.h ヘッダーは、UNICODE プリプロセッサー定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして WNetOpenEnum を定義します。エンコーディング中立のエイリアスと、エンコーディング中立でないコードを混在させると、不整合が生じてコンパイルエラーや実行時エラーの原因になることがあります。詳しくは、関数プロトタイプの規則 を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// MPR.dll (ANSI / -A)
#include <windows.h>
WIN32_ERROR WNetOpenEnumA(
NET_RESOURCE_SCOPE dwScope,
NET_RESOURCE_TYPE dwType,
WNET_OPEN_ENUM_USAGE dwUsage,
NETRESOURCEA* lpNetResource, // optional
HANDLE* lphEnum
);[DllImport("MPR.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint WNetOpenEnumA(
uint dwScope, // NET_RESOURCE_SCOPE
uint dwType, // NET_RESOURCE_TYPE
uint dwUsage, // WNET_OPEN_ENUM_USAGE
IntPtr lpNetResource, // NETRESOURCEA* optional
IntPtr lphEnum // HANDLE* out
);<DllImport("MPR.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function WNetOpenEnumA(
dwScope As UInteger, ' NET_RESOURCE_SCOPE
dwType As UInteger, ' NET_RESOURCE_TYPE
dwUsage As UInteger, ' WNET_OPEN_ENUM_USAGE
lpNetResource As IntPtr, ' NETRESOURCEA* optional
lphEnum As IntPtr ' HANDLE* out
) As UInteger
End Function' dwScope : NET_RESOURCE_SCOPE
' dwType : NET_RESOURCE_TYPE
' dwUsage : WNET_OPEN_ENUM_USAGE
' lpNetResource : NETRESOURCEA* optional
' lphEnum : HANDLE* out
Declare PtrSafe Function WNetOpenEnumA Lib "mpr" ( _
ByVal dwScope As Long, _
ByVal dwType As Long, _
ByVal dwUsage As Long, _
ByVal lpNetResource As LongPtr, _
ByVal lphEnum As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
WNetOpenEnumA = ctypes.windll.mpr.WNetOpenEnumA
WNetOpenEnumA.restype = wintypes.DWORD
WNetOpenEnumA.argtypes = [
wintypes.DWORD, # dwScope : NET_RESOURCE_SCOPE
wintypes.DWORD, # dwType : NET_RESOURCE_TYPE
wintypes.DWORD, # dwUsage : WNET_OPEN_ENUM_USAGE
ctypes.c_void_p, # lpNetResource : NETRESOURCEA* optional
ctypes.c_void_p, # lphEnum : HANDLE* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('MPR.dll')
WNetOpenEnumA = Fiddle::Function.new(
lib['WNetOpenEnumA'],
[
-Fiddle::TYPE_INT, # dwScope : NET_RESOURCE_SCOPE
-Fiddle::TYPE_INT, # dwType : NET_RESOURCE_TYPE
-Fiddle::TYPE_INT, # dwUsage : WNET_OPEN_ENUM_USAGE
Fiddle::TYPE_VOIDP, # lpNetResource : NETRESOURCEA* optional
Fiddle::TYPE_VOIDP, # lphEnum : HANDLE* out
],
-Fiddle::TYPE_INT)#[link(name = "mpr")]
extern "system" {
fn WNetOpenEnumA(
dwScope: u32, // NET_RESOURCE_SCOPE
dwType: u32, // NET_RESOURCE_TYPE
dwUsage: u32, // WNET_OPEN_ENUM_USAGE
lpNetResource: *mut NETRESOURCEA, // NETRESOURCEA* optional
lphEnum: *mut *mut core::ffi::c_void // HANDLE* out
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("MPR.dll", CharSet = CharSet.Ansi)]
public static extern uint WNetOpenEnumA(uint dwScope, uint dwType, uint dwUsage, IntPtr lpNetResource, IntPtr lphEnum);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MPR_WNetOpenEnumA' -Namespace Win32 -PassThru
# $api::WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum)#uselib "MPR.dll"
#func global WNetOpenEnumA "WNetOpenEnumA" sptr, sptr, sptr, sptr, sptr
; WNetOpenEnumA dwScope, dwType, dwUsage, varptr(lpNetResource), lphEnum ; 戻り値は stat
; dwScope : NET_RESOURCE_SCOPE -> "sptr"
; dwType : NET_RESOURCE_TYPE -> "sptr"
; dwUsage : WNET_OPEN_ENUM_USAGE -> "sptr"
; lpNetResource : NETRESOURCEA* optional -> "sptr"
; lphEnum : HANDLE* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "MPR.dll" #cfunc global WNetOpenEnumA "WNetOpenEnumA" int, int, int, var, sptr ; res = WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEA* optional -> "var" ; lphEnum : HANDLE* out -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "MPR.dll" #cfunc global WNetOpenEnumA "WNetOpenEnumA" int, int, int, sptr, sptr ; res = WNetOpenEnumA(dwScope, dwType, dwUsage, varptr(lpNetResource), lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEA* optional -> "sptr" ; lphEnum : HANDLE* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; WIN32_ERROR WNetOpenEnumA(NET_RESOURCE_SCOPE dwScope, NET_RESOURCE_TYPE dwType, WNET_OPEN_ENUM_USAGE dwUsage, NETRESOURCEA* lpNetResource, HANDLE* lphEnum) #uselib "MPR.dll" #cfunc global WNetOpenEnumA "WNetOpenEnumA" int, int, int, var, intptr ; res = WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEA* optional -> "var" ; lphEnum : HANDLE* out -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; WIN32_ERROR WNetOpenEnumA(NET_RESOURCE_SCOPE dwScope, NET_RESOURCE_TYPE dwType, WNET_OPEN_ENUM_USAGE dwUsage, NETRESOURCEA* lpNetResource, HANDLE* lphEnum) #uselib "MPR.dll" #cfunc global WNetOpenEnumA "WNetOpenEnumA" int, int, int, intptr, intptr ; res = WNetOpenEnumA(dwScope, dwType, dwUsage, varptr(lpNetResource), lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEA* optional -> "intptr" ; lphEnum : HANDLE* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
mpr = windows.NewLazySystemDLL("MPR.dll")
procWNetOpenEnumA = mpr.NewProc("WNetOpenEnumA")
)
// dwScope (NET_RESOURCE_SCOPE), dwType (NET_RESOURCE_TYPE), dwUsage (WNET_OPEN_ENUM_USAGE), lpNetResource (NETRESOURCEA* optional), lphEnum (HANDLE* out)
r1, _, err := procWNetOpenEnumA.Call(
uintptr(dwScope),
uintptr(dwType),
uintptr(dwUsage),
uintptr(lpNetResource),
uintptr(lphEnum),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // WIN32_ERRORfunction WNetOpenEnumA(
dwScope: DWORD; // NET_RESOURCE_SCOPE
dwType: DWORD; // NET_RESOURCE_TYPE
dwUsage: DWORD; // WNET_OPEN_ENUM_USAGE
lpNetResource: Pointer; // NETRESOURCEA* optional
lphEnum: Pointer // HANDLE* out
): DWORD; stdcall;
external 'MPR.dll' name 'WNetOpenEnumA';result := DllCall("MPR\WNetOpenEnumA"
, "UInt", dwScope ; NET_RESOURCE_SCOPE
, "UInt", dwType ; NET_RESOURCE_TYPE
, "UInt", dwUsage ; WNET_OPEN_ENUM_USAGE
, "Ptr", lpNetResource ; NETRESOURCEA* optional
, "Ptr", lphEnum ; HANDLE* out
, "UInt") ; return: WIN32_ERROR●WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum) = DLL("MPR.dll", "dword WNetOpenEnumA(dword, dword, dword, void*, void*)")
# 呼び出し: WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
# dwScope : NET_RESOURCE_SCOPE -> "dword"
# dwType : NET_RESOURCE_TYPE -> "dword"
# dwUsage : WNET_OPEN_ENUM_USAGE -> "dword"
# lpNetResource : NETRESOURCEA* optional -> "void*"
# lphEnum : HANDLE* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "mpr" fn WNetOpenEnumA(
dwScope: u32, // NET_RESOURCE_SCOPE
dwType: u32, // NET_RESOURCE_TYPE
dwUsage: u32, // WNET_OPEN_ENUM_USAGE
lpNetResource: [*c]NETRESOURCEA, // NETRESOURCEA* optional
lphEnum: ?*anyopaque // HANDLE* out
) callconv(std.os.windows.WINAPI) u32;proc WNetOpenEnumA(
dwScope: uint32, # NET_RESOURCE_SCOPE
dwType: uint32, # NET_RESOURCE_TYPE
dwUsage: uint32, # WNET_OPEN_ENUM_USAGE
lpNetResource: ptr NETRESOURCEA, # NETRESOURCEA* optional
lphEnum: pointer # HANDLE* out
): uint32 {.importc: "WNetOpenEnumA", stdcall, dynlib: "MPR.dll".}pragma(lib, "mpr");
extern(Windows)
uint WNetOpenEnumA(
uint dwScope, // NET_RESOURCE_SCOPE
uint dwType, // NET_RESOURCE_TYPE
uint dwUsage, // WNET_OPEN_ENUM_USAGE
NETRESOURCEA* lpNetResource, // NETRESOURCEA* optional
void* lphEnum // HANDLE* out
);ccall((:WNetOpenEnumA, "MPR.dll"), stdcall, UInt32,
(UInt32, UInt32, UInt32, Ptr{NETRESOURCEA}, Ptr{Cvoid}),
dwScope, dwType, dwUsage, lpNetResource, lphEnum)
# dwScope : NET_RESOURCE_SCOPE -> UInt32
# dwType : NET_RESOURCE_TYPE -> UInt32
# dwUsage : WNET_OPEN_ENUM_USAGE -> UInt32
# lpNetResource : NETRESOURCEA* optional -> Ptr{NETRESOURCEA}
# lphEnum : HANDLE* out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t WNetOpenEnumA(
uint32_t dwScope,
uint32_t dwType,
uint32_t dwUsage,
void* lpNetResource,
void* lphEnum);
]]
local mpr = ffi.load("mpr")
-- mpr.WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
-- dwScope : NET_RESOURCE_SCOPE
-- dwType : NET_RESOURCE_TYPE
-- dwUsage : WNET_OPEN_ENUM_USAGE
-- lpNetResource : NETRESOURCEA* optional
-- lphEnum : HANDLE* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('MPR.dll');
const WNetOpenEnumA = lib.func('__stdcall', 'WNetOpenEnumA', 'uint32_t', ['uint32_t', 'uint32_t', 'uint32_t', 'void *', 'void *']);
// WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
// dwScope : NET_RESOURCE_SCOPE -> 'uint32_t'
// dwType : NET_RESOURCE_TYPE -> 'uint32_t'
// dwUsage : WNET_OPEN_ENUM_USAGE -> 'uint32_t'
// lpNetResource : NETRESOURCEA* optional -> 'void *'
// lphEnum : HANDLE* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("MPR.dll", {
WNetOpenEnumA: { parameters: ["u32", "u32", "u32", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
// dwScope : NET_RESOURCE_SCOPE -> "u32"
// dwType : NET_RESOURCE_TYPE -> "u32"
// dwUsage : WNET_OPEN_ENUM_USAGE -> "u32"
// lpNetResource : NETRESOURCEA* optional -> "pointer"
// lphEnum : HANDLE* out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t WNetOpenEnumA(
uint32_t dwScope,
uint32_t dwType,
uint32_t dwUsage,
void* lpNetResource,
void* lphEnum);
C, "MPR.dll");
// $ffi->WNetOpenEnumA(dwScope, dwType, dwUsage, lpNetResource, lphEnum);
// dwScope : NET_RESOURCE_SCOPE
// dwType : NET_RESOURCE_TYPE
// dwUsage : WNET_OPEN_ENUM_USAGE
// lpNetResource : NETRESOURCEA* optional
// lphEnum : HANDLE* 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 Mpr extends StdCallLibrary {
Mpr INSTANCE = Native.load("mpr", Mpr.class, W32APIOptions.ASCII_OPTIONS);
int WNetOpenEnumA(
int dwScope, // NET_RESOURCE_SCOPE
int dwType, // NET_RESOURCE_TYPE
int dwUsage, // WNET_OPEN_ENUM_USAGE
Pointer lpNetResource, // NETRESOURCEA* optional
Pointer lphEnum // HANDLE* out
);
}@[Link("mpr")]
lib LibMPR
fun WNetOpenEnumA = WNetOpenEnumA(
dwScope : UInt32, # NET_RESOURCE_SCOPE
dwType : UInt32, # NET_RESOURCE_TYPE
dwUsage : UInt32, # WNET_OPEN_ENUM_USAGE
lpNetResource : NETRESOURCEA*, # NETRESOURCEA* optional
lphEnum : Void* # HANDLE* out
) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef WNetOpenEnumANative = Uint32 Function(Uint32, Uint32, Uint32, Pointer<Void>, Pointer<Void>);
typedef WNetOpenEnumADart = int Function(int, int, int, Pointer<Void>, Pointer<Void>);
final WNetOpenEnumA = DynamicLibrary.open('MPR.dll')
.lookupFunction<WNetOpenEnumANative, WNetOpenEnumADart>('WNetOpenEnumA');
// dwScope : NET_RESOURCE_SCOPE -> Uint32
// dwType : NET_RESOURCE_TYPE -> Uint32
// dwUsage : WNET_OPEN_ENUM_USAGE -> Uint32
// lpNetResource : NETRESOURCEA* optional -> Pointer<Void>
// lphEnum : HANDLE* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function WNetOpenEnumA(
dwScope: DWORD; // NET_RESOURCE_SCOPE
dwType: DWORD; // NET_RESOURCE_TYPE
dwUsage: DWORD; // WNET_OPEN_ENUM_USAGE
lpNetResource: Pointer; // NETRESOURCEA* optional
lphEnum: Pointer // HANDLE* out
): DWORD; stdcall;
external 'MPR.dll' name 'WNetOpenEnumA';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "WNetOpenEnumA"
c_WNetOpenEnumA :: Word32 -> Word32 -> Word32 -> Ptr () -> Ptr () -> IO Word32
-- dwScope : NET_RESOURCE_SCOPE -> Word32
-- dwType : NET_RESOURCE_TYPE -> Word32
-- dwUsage : WNET_OPEN_ENUM_USAGE -> Word32
-- lpNetResource : NETRESOURCEA* optional -> Ptr ()
-- lphEnum : HANDLE* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let wnetopenenuma =
foreign "WNetOpenEnumA"
(uint32_t @-> uint32_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* dwScope : NET_RESOURCE_SCOPE -> uint32_t *)
(* dwType : NET_RESOURCE_TYPE -> uint32_t *)
(* dwUsage : WNET_OPEN_ENUM_USAGE -> uint32_t *)
(* lpNetResource : NETRESOURCEA* optional -> (ptr void) *)
(* lphEnum : HANDLE* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library mpr (t "MPR.dll"))
(cffi:use-foreign-library mpr)
(cffi:defcfun ("WNetOpenEnumA" wnet-open-enum-a :convention :stdcall) :uint32
(dw-scope :uint32) ; NET_RESOURCE_SCOPE
(dw-type :uint32) ; NET_RESOURCE_TYPE
(dw-usage :uint32) ; WNET_OPEN_ENUM_USAGE
(lp-net-resource :pointer) ; NETRESOURCEA* optional
(lph-enum :pointer)) ; HANDLE* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $WNetOpenEnumA = Win32::API::More->new('MPR',
'DWORD WNetOpenEnumA(DWORD dwScope, DWORD dwType, DWORD dwUsage, LPVOID lpNetResource, HANDLE lphEnum)');
# my $ret = $WNetOpenEnumA->Call($dwScope, $dwType, $dwUsage, $lpNetResource, $lphEnum);
# dwScope : NET_RESOURCE_SCOPE -> DWORD
# dwType : NET_RESOURCE_TYPE -> DWORD
# dwUsage : WNET_OPEN_ENUM_USAGE -> DWORD
# lpNetResource : NETRESOURCEA* optional -> LPVOID
# lphEnum : HANDLE* out -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f WNetOpenEnumW (Unicode版) — ネットワークリソースの列挙を開始する(Unicode版)。
- f WNetCloseEnum — ネットワークリソース列挙のハンドルを閉じる。
- f WNetEnumResourceA — 列挙ハンドルからネットワークリソースを取得する(ANSI版)。