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

WNetOpenEnumA

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

シグネチャ

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

パラメーター

名前型方向説明
dwScopeNET_RESOURCE_SCOPEin

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

値 意味
RESOURCE_CONNECTED
現在接続されているすべてのリソースを列挙します。この関数は dwUsage パラメーターを無視します。詳しくは、後述の「解説」セクションを参照してください。
RESOURCE_CONTEXT
呼び出し元のネットワークコンテキスト内のリソースのみを列挙します。ネットワークコンピューター表示の場合はこの値を指定します。この関数は 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 と等しい場合を除いて無視されます。詳しくは、後述の「解説」セクションを参照してください。

lpNetResourceNETRESOURCEA*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 関数を呼び出すことで列挙を継続できます。(ANSI)

戻り値

関数が成功すると、戻り値は 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 ヘッダーは、UNICODE プリプロセッサー定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして WNetOpenEnum を定義します。エンコーディング中立のエイリアスと、エンコーディング中立でないコードを混在させると、不整合が生じてコンパイルエラーや実行時エラーの原因になることがあります。詳しくは、関数プロトタイプの規則 を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。
出力引数:
; 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 方式にも切替可。
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_ERROR
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';
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 を使用。

関連項目

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