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

WNetOpenEnumW

関数
ネットワークリソースの列挙を開始する(Unicode版)。
DLLMPR.dll文字セットUnicode (-W)呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// 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
);

パラメーター

名前型方向説明
dwScopeNET_RESOURCE_SCOPEin

列挙の範囲。このパラメーターには、次のいずれかの値を指定できます。

値 意味
RESOURCE_CONNECTED
現在接続されているすべてのリソースを列挙します。この関数は dwUsage パラメーターを無視します。詳細については、後述の「解説」セクションを参照してください。
RESOURCE_CONTEXT
呼び出し元のネットワークコンテキスト内のリソースのみを列挙します。ネットワークコンピューター (Network Neighborhood) のビューにはこの値を指定します。この関数は dwUsage パラメーターを無視します。
RESOURCE_GLOBALNET
ネットワーク上のすべてのリソースを列挙します。
RESOURCE_REMEMBERED
記憶されている (永続的な) 接続をすべて列挙します。この関数は dwUsage パラメーターを無視します。
dwTypeNET_RESOURCE_TYPEin

列挙するリソースの種類。このパラメーターには、次の値の組み合わせを指定できます。

値 意味
RESOURCETYPE_ANY
すべてのリソース。この値は RESOURCETYPE_DISK または RESOURCETYPE_PRINT と組み合わせることはできません。
RESOURCETYPE_DISK
すべてのディスクリソース。
RESOURCETYPE_PRINT
すべての印刷リソース。

ネットワークプロバイダーが印刷リソースとディスクリソースを区別できない場合は、すべてのリソースを列挙することがあります。

dwUsageWNET_OPEN_ENUM_USAGEin

列挙するリソースの使用法の種類。このパラメーターには、次の値の組み合わせを指定できます。

値 意味
0
すべてのリソース。
RESOURCEUSAGE_CONNECTABLE
接続可能なすべてのリソース。
RESOURCEUSAGE_CONTAINER
コンテナーであるすべてのリソース。
RESOURCEUSAGE_ATTACHED
この値を設定すると、ユーザーが認証されていない場合に WNetOpenEnum は必ず失敗します。認証なしでの列挙を許可するネットワークであっても、この関数は失敗します。
RESOURCEUSAGE_ALL
この値を設定することは、RESOURCEUSAGE_CONNECTABLE、RESOURCEUSAGE_CONTAINER、および RESOURCEUSAGE_ATTACHED を設定することと同等です。

このパラメーターは、dwScope パラメーターが RESOURCE_GLOBALNET と等しい場合を除いて無視されます。詳細については、後述の「解説」セクションを参照してください。

lpNetResourceNETRESOURCEW*inoptional

列挙するコンテナーを指定する NETRESOURCE 構造体へのポインター。dwScope パラメーターが RESOURCE_GLOBALNET でない場合、このパラメーターは NULL でなければなりません。

このパラメーターが NULL の場合は、ネットワークのルートが指定されたものと見なされます。(システムはネットワークを階層として構成しており、ルートはネットワーク内の最上位のコンテナーです。)

このパラメーターが NULL でない場合は、 NETRESOURCE 構造体を指している必要があります。この構造体は、アプリケーションが値を設定することも、 WNetEnumResource 関数の呼び出しによって返されたものを使用することもできます。 NETRESOURCE 構造体には、コンテナーリソースを指定する必要があります。すなわち、dwUsage パラメーターに RESOURCEUSAGE_CONTAINER 値を指定する必要があります。

すべてのネットワークリソースを列挙するには、まず lpNetResource パラメーターに NULL を指定して WNetOpenEnum を呼び出して列挙を開始し、返されたハンドルを使用して WNetEnumResource を呼び出してリソースを列挙します。 WNetEnumResource 関数が返す NETRESOURCE 配列内のリソースのいずれかがコンテナーリソースである場合は、 WNetOpenEnum を呼び出してそのリソースを開き、さらに列挙を進めることができます。

lphEnumHANDLE*out後続の WNetEnumResource の呼び出しで使用できる列挙ハンドルへのポインター。

戻り値の型: WIN32_ERROR

公式ドキュメント

WNetOpenEnum 関数は、ネットワークリソースまたは既存の接続の列挙を開始します。WNetEnumResource 関数を呼び出すことで列挙を継続できます。(Unicode)

戻り値

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

関数が失敗した場合、戻り値は システムエラーコード であり、たとえば次のいずれかの値です。

戻り値 説明
ERROR_NOT_CONTAINER
lpNetResource パラメーターがコンテナーを指していません。
ERROR_INVALID_PARAMETER
dwScope パラメーターまたは dwType パラメーターが無効であるか、パラメーターの組み合わせが無効です。
ERROR_NO_NETWORK
ネットワークが利用できません。
ERROR_EXTENDED_ERROR
ネットワーク固有のエラーが発生しました。エラーの説明を取得するには、 WNetGetLastError 関数を呼び出します。
ERROR_INVALID_ADDRESS
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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。
出力引数:
; 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 方式にも切替可。
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_ERROR
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';
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 変換を行う。

関連項目

文字セット違い
公式の関連項目
使用する型