WNetOpenEnumW
関数シグネチャ
// MPR.dll (Unicode / -W)
#include <windows.h>
WIN32_ERROR WNetOpenEnumW(
NET_RESOURCE_SCOPE dwScope,
NET_RESOURCE_TYPE dwType,
WNET_OPEN_ENUM_USAGE dwUsage,
NETRESOURCEW* lpNetResource, // optional
HANDLE* lphEnum
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dwScope | NET_RESOURCE_SCOPE | in | 列挙の範囲。このパラメーターには、次のいずれかの値を指定できます。 | ||||||||||||
| dwType | NET_RESOURCE_TYPE | in | 列挙するリソースの種類。このパラメーターには、次の値の組み合わせを指定できます。
ネットワークプロバイダーが印刷リソースとディスクリソースを区別できない場合は、すべてのリソースを列挙することがあります。 | ||||||||||||
| dwUsage | WNET_OPEN_ENUM_USAGE | in | 列挙するリソースの使用法の種類。このパラメーターには、次の値の組み合わせを指定できます。
このパラメーターは、dwScope パラメーターが RESOURCE_GLOBALNET と等しい場合を除いて無視されます。詳細については、後述の「解説」セクションを参照してください。 | ||||||||||||
| lpNetResource | NETRESOURCEW* | 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 関数を呼び出すことで列挙を継続できます。(Unicode)
戻り値
関数が成功した場合、戻り値は 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 ヘッダーは WNetOpenEnum を、UNICODE プリプロセッサー定数の定義に応じてこの関数の ANSI 版と Unicode 版を自動的に選択するエイリアスとして定義しています。このエンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となることがあります。詳細については、Conventions for Function Prototypes を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// MPR.dll (Unicode / -W)
#include <windows.h>
WIN32_ERROR WNetOpenEnumW(
NET_RESOURCE_SCOPE dwScope,
NET_RESOURCE_TYPE dwType,
WNET_OPEN_ENUM_USAGE dwUsage,
NETRESOURCEW* lpNetResource, // optional
HANDLE* lphEnum
);[DllImport("MPR.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint WNetOpenEnumW(
uint dwScope, // NET_RESOURCE_SCOPE
uint dwType, // NET_RESOURCE_TYPE
uint dwUsage, // WNET_OPEN_ENUM_USAGE
IntPtr lpNetResource, // NETRESOURCEW* optional
IntPtr lphEnum // HANDLE* out
);<DllImport("MPR.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function WNetOpenEnumW(
dwScope As UInteger, ' NET_RESOURCE_SCOPE
dwType As UInteger, ' NET_RESOURCE_TYPE
dwUsage As UInteger, ' WNET_OPEN_ENUM_USAGE
lpNetResource As IntPtr, ' NETRESOURCEW* optional
lphEnum As IntPtr ' HANDLE* out
) As UInteger
End Function' dwScope : NET_RESOURCE_SCOPE
' dwType : NET_RESOURCE_TYPE
' dwUsage : WNET_OPEN_ENUM_USAGE
' lpNetResource : NETRESOURCEW* optional
' lphEnum : HANDLE* out
Declare PtrSafe Function WNetOpenEnumW Lib "mpr" ( _
ByVal dwScope As Long, _
ByVal dwType As Long, _
ByVal dwUsage As Long, _
ByVal lpNetResource As LongPtr, _
ByVal lphEnum As LongPtr) As Long
' 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
WNetOpenEnumW = ctypes.windll.mpr.WNetOpenEnumW
WNetOpenEnumW.restype = wintypes.DWORD
WNetOpenEnumW.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 : NETRESOURCEW* optional
ctypes.c_void_p, # lphEnum : HANDLE* out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('MPR.dll')
WNetOpenEnumW = Fiddle::Function.new(
lib['WNetOpenEnumW'],
[
-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 : NETRESOURCEW* optional
Fiddle::TYPE_VOIDP, # lphEnum : HANDLE* out
],
-Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"#[link(name = "mpr")]
extern "system" {
fn WNetOpenEnumW(
dwScope: u32, // NET_RESOURCE_SCOPE
dwType: u32, // NET_RESOURCE_TYPE
dwUsage: u32, // WNET_OPEN_ENUM_USAGE
lpNetResource: *mut NETRESOURCEW, // NETRESOURCEW* 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.Unicode)]
public static extern uint WNetOpenEnumW(uint dwScope, uint dwType, uint dwUsage, IntPtr lpNetResource, IntPtr lphEnum);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MPR_WNetOpenEnumW' -Namespace Win32 -PassThru
# $api::WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum)#uselib "MPR.dll"
#func global WNetOpenEnumW "WNetOpenEnumW" wptr, wptr, wptr, wptr, wptr
; WNetOpenEnumW dwScope, dwType, dwUsage, varptr(lpNetResource), lphEnum ; 戻り値は stat
; dwScope : NET_RESOURCE_SCOPE -> "wptr"
; dwType : NET_RESOURCE_TYPE -> "wptr"
; dwUsage : WNET_OPEN_ENUM_USAGE -> "wptr"
; lpNetResource : NETRESOURCEW* optional -> "wptr"
; lphEnum : HANDLE* out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "MPR.dll" #cfunc global WNetOpenEnumW "WNetOpenEnumW" int, int, int, var, sptr ; res = WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEW* optional -> "var" ; lphEnum : HANDLE* out -> "sptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "MPR.dll" #cfunc global WNetOpenEnumW "WNetOpenEnumW" int, int, int, sptr, sptr ; res = WNetOpenEnumW(dwScope, dwType, dwUsage, varptr(lpNetResource), lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEW* optional -> "sptr" ; lphEnum : HANDLE* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; WIN32_ERROR WNetOpenEnumW(NET_RESOURCE_SCOPE dwScope, NET_RESOURCE_TYPE dwType, WNET_OPEN_ENUM_USAGE dwUsage, NETRESOURCEW* lpNetResource, HANDLE* lphEnum) #uselib "MPR.dll" #cfunc global WNetOpenEnumW "WNetOpenEnumW" int, int, int, var, intptr ; res = WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEW* optional -> "var" ; lphEnum : HANDLE* out -> "intptr" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; WIN32_ERROR WNetOpenEnumW(NET_RESOURCE_SCOPE dwScope, NET_RESOURCE_TYPE dwType, WNET_OPEN_ENUM_USAGE dwUsage, NETRESOURCEW* lpNetResource, HANDLE* lphEnum) #uselib "MPR.dll" #cfunc global WNetOpenEnumW "WNetOpenEnumW" int, int, int, intptr, intptr ; res = WNetOpenEnumW(dwScope, dwType, dwUsage, varptr(lpNetResource), lphEnum) ; dwScope : NET_RESOURCE_SCOPE -> "int" ; dwType : NET_RESOURCE_TYPE -> "int" ; dwUsage : WNET_OPEN_ENUM_USAGE -> "int" ; lpNetResource : NETRESOURCEW* optional -> "intptr" ; lphEnum : HANDLE* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
mpr = windows.NewLazySystemDLL("MPR.dll")
procWNetOpenEnumW = mpr.NewProc("WNetOpenEnumW")
)
// dwScope (NET_RESOURCE_SCOPE), dwType (NET_RESOURCE_TYPE), dwUsage (WNET_OPEN_ENUM_USAGE), lpNetResource (NETRESOURCEW* optional), lphEnum (HANDLE* out)
r1, _, err := procWNetOpenEnumW.Call(
uintptr(dwScope),
uintptr(dwType),
uintptr(dwUsage),
uintptr(lpNetResource),
uintptr(lphEnum),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // WIN32_ERRORfunction WNetOpenEnumW(
dwScope: DWORD; // NET_RESOURCE_SCOPE
dwType: DWORD; // NET_RESOURCE_TYPE
dwUsage: DWORD; // WNET_OPEN_ENUM_USAGE
lpNetResource: Pointer; // NETRESOURCEW* optional
lphEnum: Pointer // HANDLE* out
): DWORD; stdcall;
external 'MPR.dll' name 'WNetOpenEnumW';result := DllCall("MPR\WNetOpenEnumW"
, "UInt", dwScope ; NET_RESOURCE_SCOPE
, "UInt", dwType ; NET_RESOURCE_TYPE
, "UInt", dwUsage ; WNET_OPEN_ENUM_USAGE
, "Ptr", lpNetResource ; NETRESOURCEW* optional
, "Ptr", lphEnum ; HANDLE* out
, "UInt") ; return: WIN32_ERROR●WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum) = DLL("MPR.dll", "dword WNetOpenEnumW(dword, dword, dword, void*, void*)")
# 呼び出し: WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
# dwScope : NET_RESOURCE_SCOPE -> "dword"
# dwType : NET_RESOURCE_TYPE -> "dword"
# dwUsage : WNET_OPEN_ENUM_USAGE -> "dword"
# lpNetResource : NETRESOURCEW* optional -> "void*"
# lphEnum : HANDLE* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。const std = @import("std");
extern "mpr" fn WNetOpenEnumW(
dwScope: u32, // NET_RESOURCE_SCOPE
dwType: u32, // NET_RESOURCE_TYPE
dwUsage: u32, // WNET_OPEN_ENUM_USAGE
lpNetResource: [*c]NETRESOURCEW, // NETRESOURCEW* optional
lphEnum: ?*anyopaque // HANDLE* out
) callconv(std.os.windows.WINAPI) u32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。proc WNetOpenEnumW(
dwScope: uint32, # NET_RESOURCE_SCOPE
dwType: uint32, # NET_RESOURCE_TYPE
dwUsage: uint32, # WNET_OPEN_ENUM_USAGE
lpNetResource: ptr NETRESOURCEW, # NETRESOURCEW* optional
lphEnum: pointer # HANDLE* out
): uint32 {.importc: "WNetOpenEnumW", stdcall, dynlib: "MPR.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。pragma(lib, "mpr");
extern(Windows)
uint WNetOpenEnumW(
uint dwScope, // NET_RESOURCE_SCOPE
uint dwType, // NET_RESOURCE_TYPE
uint dwUsage, // WNET_OPEN_ENUM_USAGE
NETRESOURCEW* lpNetResource, // NETRESOURCEW* optional
void* lphEnum // HANDLE* out
);ccall((:WNetOpenEnumW, "MPR.dll"), stdcall, UInt32,
(UInt32, UInt32, UInt32, Ptr{NETRESOURCEW}, Ptr{Cvoid}),
dwScope, dwType, dwUsage, lpNetResource, lphEnum)
# dwScope : NET_RESOURCE_SCOPE -> UInt32
# dwType : NET_RESOURCE_TYPE -> UInt32
# dwUsage : WNET_OPEN_ENUM_USAGE -> UInt32
# lpNetResource : NETRESOURCEW* optional -> Ptr{NETRESOURCEW}
# lphEnum : HANDLE* out -> Ptr{Cvoid}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。local ffi = require("ffi")
ffi.cdef[[
uint32_t WNetOpenEnumW(
uint32_t dwScope,
uint32_t dwType,
uint32_t dwUsage,
void* lpNetResource,
void* lphEnum);
]]
local mpr = ffi.load("mpr")
-- mpr.WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
-- dwScope : NET_RESOURCE_SCOPE
-- dwType : NET_RESOURCE_TYPE
-- dwUsage : WNET_OPEN_ENUM_USAGE
-- lpNetResource : NETRESOURCEW* optional
-- lphEnum : HANDLE* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。const koffi = require('koffi');
const lib = koffi.load('MPR.dll');
const WNetOpenEnumW = lib.func('__stdcall', 'WNetOpenEnumW', 'uint32_t', ['uint32_t', 'uint32_t', 'uint32_t', 'void *', 'void *']);
// WNetOpenEnumW(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 : NETRESOURCEW* optional -> 'void *'
// lphEnum : HANDLE* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("MPR.dll", {
WNetOpenEnumW: { parameters: ["u32", "u32", "u32", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum)
// dwScope : NET_RESOURCE_SCOPE -> "u32"
// dwType : NET_RESOURCE_TYPE -> "u32"
// dwUsage : WNET_OPEN_ENUM_USAGE -> "u32"
// lpNetResource : NETRESOURCEW* optional -> "pointer"
// lphEnum : HANDLE* out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t WNetOpenEnumW(
uint32_t dwScope,
uint32_t dwType,
uint32_t dwUsage,
void* lpNetResource,
void* lphEnum);
C, "MPR.dll");
// $ffi->WNetOpenEnumW(dwScope, dwType, dwUsage, lpNetResource, lphEnum);
// dwScope : NET_RESOURCE_SCOPE
// dwType : NET_RESOURCE_TYPE
// dwUsage : WNET_OPEN_ENUM_USAGE
// lpNetResource : NETRESOURCEW* 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.UNICODE_OPTIONS);
int WNetOpenEnumW(
int dwScope, // NET_RESOURCE_SCOPE
int dwType, // NET_RESOURCE_TYPE
int dwUsage, // WNET_OPEN_ENUM_USAGE
Pointer lpNetResource, // NETRESOURCEW* optional
Pointer lphEnum // HANDLE* out
);
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。@[Link("mpr")]
lib LibMPR
fun WNetOpenEnumW = WNetOpenEnumW(
dwScope : UInt32, # NET_RESOURCE_SCOPE
dwType : UInt32, # NET_RESOURCE_TYPE
dwUsage : UInt32, # WNET_OPEN_ENUM_USAGE
lpNetResource : NETRESOURCEW*, # NETRESOURCEW* 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 WNetOpenEnumWNative = Uint32 Function(Uint32, Uint32, Uint32, Pointer<Void>, Pointer<Void>);
typedef WNetOpenEnumWDart = int Function(int, int, int, Pointer<Void>, Pointer<Void>);
final WNetOpenEnumW = DynamicLibrary.open('MPR.dll')
.lookupFunction<WNetOpenEnumWNative, WNetOpenEnumWDart>('WNetOpenEnumW');
// dwScope : NET_RESOURCE_SCOPE -> Uint32
// dwType : NET_RESOURCE_TYPE -> Uint32
// dwUsage : WNET_OPEN_ENUM_USAGE -> Uint32
// lpNetResource : NETRESOURCEW* optional -> Pointer<Void>
// lphEnum : HANDLE* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function WNetOpenEnumW(
dwScope: DWORD; // NET_RESOURCE_SCOPE
dwType: DWORD; // NET_RESOURCE_TYPE
dwUsage: DWORD; // WNET_OPEN_ENUM_USAGE
lpNetResource: Pointer; // NETRESOURCEW* optional
lphEnum: Pointer // HANDLE* out
): DWORD; stdcall;
external 'MPR.dll' name 'WNetOpenEnumW';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "WNetOpenEnumW"
c_WNetOpenEnumW :: Word32 -> Word32 -> Word32 -> Ptr () -> Ptr () -> IO Word32
-- dwScope : NET_RESOURCE_SCOPE -> Word32
-- dwType : NET_RESOURCE_TYPE -> Word32
-- dwUsage : WNET_OPEN_ENUM_USAGE -> Word32
-- lpNetResource : NETRESOURCEW* optional -> Ptr ()
-- lphEnum : HANDLE* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let wnetopenenumw =
foreign "WNetOpenEnumW"
(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 : NETRESOURCEW* 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 ("WNetOpenEnumW" wnet-open-enum-w :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) ; NETRESOURCEW* optional
(lph-enum :pointer)) ; HANDLE* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $WNetOpenEnumW = Win32::API::More->new('MPR',
'DWORD WNetOpenEnumW(DWORD dwScope, DWORD dwType, DWORD dwUsage, LPVOID lpNetResource, HANDLE lphEnum)');
# my $ret = $WNetOpenEnumW->Call($dwScope, $dwType, $dwUsage, $lpNetResource, $lphEnum);
# dwScope : NET_RESOURCE_SCOPE -> DWORD
# dwType : NET_RESOURCE_TYPE -> DWORD
# dwUsage : WNET_OPEN_ENUM_USAGE -> DWORD
# lpNetResource : NETRESOURCEW* optional -> LPVOID
# lphEnum : HANDLE* out -> HANDLE
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。関連項目
- f WNetOpenEnumA (ANSI版) — ネットワークリソースの列挙を開始する(ANSI版)。
- f WNetCloseEnum — ネットワークリソース列挙のハンドルを閉じる。
- f WNetEnumResourceW — 列挙ハンドルからネットワークリソースを取得する(Unicode版)。