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

WNetAddConnection3W

関数
所有ウィンドウを指定してネットワークリソースに接続する(Unicode版)。
DLLMPR.dll文字セットUnicode (-W)呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// MPR.dll  (Unicode / -W)
#include <windows.h>

WIN32_ERROR WNetAddConnection3W(
    HWND hwndOwner,   // optional
    NETRESOURCEW* lpNetResource,
    LPCWSTR lpPassword,   // optional
    LPCWSTR lpUserName,   // optional
    NET_CONNECT_FLAGS dwFlags
);

パラメーター

名前型方向説明
hwndOwnerHWNDinoptional

ネットワークリソースのプロバイダーがダイアログボックスのオーナーウィンドウとして使用できる、ウィンドウへのハンドルです。dwFlags パラメーターに CONNECT_INTERACTIVE 値を設定する場合は、このパラメーターを使用します。

hwndOwner パラメーターには NULL を指定できます。NULL の場合、 WNetAddConnection3 の呼び出しは WNetAddConnection2 関数の呼び出しと同等になります。

lpNetResourceNETRESOURCEW*in

ネットワークリソース、ローカルデバイス、ネットワークリソースプロバイダーに関する情報など、確立しようとする接続の詳細を指定する NETRESOURCE 構造体へのポインターです。

NETRESOURCE 構造体の次のメンバーを指定する必要があります。

メンバー 意味
dwType
接続先のネットワークリソースの種類です。

lpLocalName メンバーが空でない文字列を指す場合、このメンバーには RESOURCETYPE_DISK または RESOURCETYPE_PRINT を指定できます。

lpLocalName が NULL の場合、または空の文字列を指す場合、dwType には RESOURCETYPE_DISK、RESOURCETYPE_PRINT、または RESOURCETYPE_ANY を指定できます。

このメンバーは必須ですが、その情報はネットワークサービスプロバイダーによって無視されることがあります。

lpLocalName
"F:" や "LPT1" など、リダイレクトするローカルデバイスの名前を指定する null 終端文字列へのポインターです。この文字列は大文字と小文字が区別されません。

文字列が空の場合、または lpLocalName が NULL の場合、この関数はローカルデバイスをリダイレクトせずにネットワークリソースへ接続します。

lpRemoteName
接続先のネットワークリソースを指定する null 終端文字列へのポインターです。文字列の長さは最大 MAX_PATH 文字で、ネットワークプロバイダーの命名規則に従う必要があります。
lpProvider
接続先のネットワークプロバイダーを指定する null 終端文字列へのポインターです。

lpProvider が NULL の場合、または空の文字列を指す場合、オペレーティングシステムは lpRemoteName メンバーが指す文字列を解析して、正しいプロバイダーの特定を試みます。

このメンバーが NULL でない場合、オペレーティングシステムは指定されたネットワークプロバイダーに対してのみ接続を試みます。

このメンバーは、使用するネットワークプロバイダーが分かっている場合にのみ設定してください。それ以外の場合は、ネットワーク名がどのネットワークプロバイダーに対応するかをオペレーティングシステムに判断させてください。

WNetAddConnection3 関数は、 NETRESOURCE 構造体の他のメンバーを無視します。

lpPasswordLPCWSTRinoptional

ネットワーク接続の確立に使用するパスワードを指定する null 終端文字列へのポインターです。

lpPassword が NULL の場合、この関数は lpUserName パラメーターで指定されたユーザーに関連付けられている現在の既定のパスワードを使用します。

lpPassword が空の文字列を指す場合、この関数はパスワードを使用しません。

無効なパスワードが原因で接続に失敗し、かつ dwFlags パラメーターに CONNECT_INTERACTIVE 値が設定されている場合、この関数はパスワードの入力を求めるダイアログボックスを表示します。

Windows Me/98/95: このパラメーターは NULL または空の文字列である必要があります。

lpUserNameLPCWSTRinoptional

接続の確立に使用するユーザー名を指定する null 終端文字列へのポインターです。

lpUserName が NULL の場合、この関数は既定のユーザー名を使用します(既定のユーザー名はプロセスのユーザーコンテキストによって提供されます)。

lpUserName パラメーターは、既定のユーザー名またはアカウントとは異なるユーザー名やアカウントが割り当てられているネットワークリソースに接続する場合に指定します。

ユーザー名の文字列は セキュリティコンテキストを表します。これはネットワークプロバイダーに固有の場合があります。

Windows Me/98/95: このパラメーターは NULL または空の文字列である必要があります。

dwFlagsNET_CONNECT_FLAGSin

接続オプションのセットです。現在、次の値が定義されています。

値 意味
CONNECT_INTERACTIVE
このフラグが設定されている場合、オペレーティングシステムは認証のためにユーザーと対話することがあります。
CONNECT_PROMPT
このフラグは、代替の値を指定する機会をユーザーに与えずにユーザー名やパスワードの既定の設定を使用しないよう、システムに指示します。CONNECT_INTERACTIVE も設定されていない限り、このフラグは無視されます。
CONNECT_REDIRECT
このフラグは、接続の確立時にローカルデバイスのリダイレクトを強制します。

NETRESOURCE の lpLocalName メンバーでリダイレクトするローカルデバイスが指定されている場合、オペレーティングシステムは指定されたデバイスのリダイレクトを引き続き試みるため、このフラグは効果を持ちません。オペレーティングシステムがローカルデバイスを自動的に選択する場合、dwType メンバーを RESOURCETYPE_ANY にすることはできません。

このフラグが設定されていない場合、ローカルデバイスは、ネットワークがローカルデバイスのリダイレクトを必要とする場合にのみ自動的に選択されます。

Windows Server 2003 および Windows XP: システムがネットワークドライブ文字を自動的に割り当てる場合、Z: から始まり、次に Y:、最後に C: の順に割り当てられます。これにより、ログオンごとのドライブ文字(ネットワークドライブ文字など)とグローバルなドライブ文字(ディスクドライブなど)との衝突が減少します。以前のバージョンの Windows では、C: から始まり Z: で終わる順にドライブ文字が割り当てられていた点に注意してください。

CONNECT_UPDATE_PROFILE
ネットワークリソースへの接続を記憶します。

このビットフラグが設定されている場合、オペレーティングシステムはユーザーのログオン時に接続の復元を自動的に試みます。

オペレーティングシステムは、ローカルデバイスをリダイレクトした成功した接続のみを記憶します。失敗した接続やデバイスなしの接続は記憶しません(デバイスなしの接続とは、lpLocalName メンバーが NULL であるか、空の文字列を指す場合の接続です)。

このビットフラグがクリアされている場合、オペレーティングシステムはログオン時に接続を自動的に復元しません。

CONNECT_COMMANDLINE
このフラグが設定されている場合、オペレーティングシステムはグラフィカルユーザーインターフェイス(GUI)ではなくコマンドラインを使用してユーザーに認証を求めます。CONNECT_INTERACTIVE も設定されていない限り、このフラグは無視されます。

Windows 2000/NT および Windows Me/98/95: この値はサポートされていません。

CONNECT_CMD_SAVECRED
このフラグが設定されており、オペレーティングシステムが資格情報の入力を求める場合、その資格情報は資格情報マネージャーによって保存されます。呼び出し元のログオンセッションで資格情報マネージャーが無効になっている場合、またはネットワークプロバイダーが資格情報の保存をサポートしていない場合、このフラグは無視されます。また、CONNECT_COMMANDLINE フラグを設定していない場合も、このフラグは無視されます。

Windows 2000/NT および Windows Me/98/95: この値はサポートされていません。

戻り値の型: WIN32_ERROR

公式ドキュメント

WNetAddConnection3 関数は、ネットワークリソースへの接続を確立します。この関数では、ローカルデバイスをネットワークリソースにリダイレクトできます。(Unicode)

戻り値

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

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

戻り値 説明
ERROR_ACCESS_DENIED
呼び出し元にはネットワークリソースへのアクセス権がありません。
ERROR_ALREADY_ASSIGNED
lpLocalName メンバーで指定されたローカルデバイスは、既にネットワークリソースに接続されています。
ERROR_BAD_DEV_TYPE
ローカルデバイスの種類とネットワークリソースの種類が一致しません。
ERROR_BAD_DEVICE
lpLocalName で指定された値が無効です。
ERROR_BAD_NET_NAME
lpRemoteName メンバーで指定された値は、リソース名が無効であるか、指定されたリソースが見つからないため、どのネットワークリソースプロバイダーにも受け入れられません。
ERROR_BAD_PROFILE
ユーザープロファイルの形式が正しくありません。
ERROR_BAD_PROVIDER
lpProvider メンバーで指定された値が、どのプロバイダーとも一致しません。
ERROR_BUSY
ルーターまたはプロバイダーがビジー状態です(初期化中の可能性があります)。呼び出し元は再試行してください。
ERROR_CANCELLED
接続の試行が、いずれかのネットワークリソースプロバイダーのダイアログボックスを通じてユーザーによって、または呼び出されたリソースによってキャンセルされました。
ERROR_CANNOT_OPEN_PROFILE
システムは、永続的な接続を処理するためのユーザープロファイルを開くことができません。
ERROR_DEVICE_ALREADY_REMEMBERED
lpLocalName メンバーで指定されたデバイスのエントリが、既にユーザープロファイルに存在します。
ERROR_EXTENDED_ERROR
ネットワーク固有のエラーが発生しました。エラーの説明を取得するには、 WNetGetLastError 関数を呼び出してください。
ERROR_INVALID_PASSWORD
指定されたパスワードが無効で、かつ CONNECT_INTERACTIVE フラグが設定されていません。
ERROR_NO_NET_OR_BAD_PATH
ネットワークコンポーネントが開始されていないか、指定された名前を使用できないため、操作を実行できません。
ERROR_NO_NETWORK
ネットワークが利用できません。

解説(Remarks)

WNetUseConnection 関数は WNetAddConnection3 関数に似ています。主な違いは、 WNetUseConnection ではネットワークリソースへのリダイレクト先として使用されていないローカルデバイスを自動的に選択できる点です。

Windows Server 2003 および Windows XP では、MS-DOS デバイスは AuthenticationID(ログオンセッションに関連付けられた ローカル一意識別子、すなわち LUID)によって識別されるため、WNet 関数はログオンセッションに関連付けられた MS-DOS デバイス名前空間内でネットワークドライブ文字を作成および削除します。このことは、あるユーザーログオンで WNet 関数のいずれかを呼び出してネットワークドライブ文字を作成し、別のユーザーログオンで既存のネットワークドライブ文字を照会するアプリケーションに影響する可能性があります。このような状況の例としては、たとえば CreateProcessAsUser 関数を呼び出すことによってログオンセッション内にユーザーの 2 番目のログオンが作成され、その 2 番目のログオンで GetLogicalDrives 関数を呼び出すアプリケーションが実行される場合が挙げられます。GetLogicalDrives 関数の呼び出しでは、最初のログオンで WNet 関数の呼び出しによって作成されたネットワークドライブ文字は返されません。前述の例では最初のログオンセッションはまだ存在しており、この例はターミナルサービスセッションを含む任意のログオンセッションに当てはまる点に注意してください。詳細については、 Defining an MS-DOS Device Name を参照してください。

Windows Server 2003 および Windows XP では、LocalSystem として実行されるサービスが WNetAddConnection3 関数を呼び出した場合、マップされたドライブはすべてのユーザーログオンセッションから参照できます。

Microsoft のネットワークプロバイダーの場合、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpRemoteName メンバーには、ドット付き 10 進表記の IPv4 アドレスを含めることができます。共有の例を次に示します。

\192.168.1.1\share

Windows Vista 以降の Microsoft のネットワークプロバイダーの場合、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpRemoteName メンバーには IPv6 アドレスを含めることができます。ただし、IPv6 アドレスが正しく解析されるように、IPv6 リテラル形式を使用する必要があります。IPv6 リテラルアドレスの形式は次のとおりです。

ipv6-address の ':' 文字を '-' 文字に置き換え、その後ろに ".ipv6-literal.net" 文字列を付加したもの。

たとえば、次の IPv6 アドレスの場合、

2001:4898:9:3:c069:aa97:fe76:2449

共有の例は次のようになります。

\2001-4898-9-3-c069-aa97-fe76-2449.ipv6-literal.net\share

他のネットワークプロバイダーでも、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpRemoteName メンバーに IPv4 または IPv6 アドレスを含めることをサポートしている場合がありますが、これは各ネットワークプロバイダー次第です。

Windows 7 および Windows Server 2008 R2: WNetAddConnection3 関数を pUsername と lpPassword に明示的なユーザー資格情報を指定して呼び出し、特定のサーバー上のネットワークリソースへの接続を確立した後、同じサーバーに対してこれらのパラメーターのいずれかを NULL(既定のユーザー名または既定のパスワードを使用する場合)にして再度呼び出すと、その呼び出しは失敗します。返されるエラーは ERROR_BAD_USERNAME または ERROR_INVALID_PASSWORD です。

メモ

winnetwk.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして WNetAddConnection3 を定義しています。エンコーディング非依存のエイリアスの使用と、エンコーディング非依存でないコードを混在させると、不整合が生じ、コンパイルエラーや実行時エラーの原因となる可能性があります。詳細については、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 WNetAddConnection3W(
    HWND hwndOwner,   // optional
    NETRESOURCEW* lpNetResource,
    LPCWSTR lpPassword,   // optional
    LPCWSTR lpUserName,   // optional
    NET_CONNECT_FLAGS dwFlags
);
[DllImport("MPR.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint WNetAddConnection3W(
    IntPtr hwndOwner,   // HWND optional
    IntPtr lpNetResource,   // NETRESOURCEW*
    [MarshalAs(UnmanagedType.LPWStr)] string lpPassword,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string lpUserName,   // LPCWSTR optional
    uint dwFlags   // NET_CONNECT_FLAGS
);
<DllImport("MPR.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)>
Public Shared Function WNetAddConnection3W(
    hwndOwner As IntPtr,   ' HWND optional
    lpNetResource As IntPtr,   ' NETRESOURCEW*
    <MarshalAs(UnmanagedType.LPWStr)> lpPassword As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpUserName As String,   ' LPCWSTR optional
    dwFlags As UInteger   ' NET_CONNECT_FLAGS
) As UInteger
End Function
' hwndOwner : HWND optional
' lpNetResource : NETRESOURCEW*
' lpPassword : LPCWSTR optional
' lpUserName : LPCWSTR optional
' dwFlags : NET_CONNECT_FLAGS
Declare PtrSafe Function WNetAddConnection3W Lib "mpr" ( _
    ByVal hwndOwner As LongPtr, _
    ByVal lpNetResource As LongPtr, _
    ByVal lpPassword As LongPtr, _
    ByVal lpUserName As LongPtr, _
    ByVal dwFlags As Long) 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

WNetAddConnection3W = ctypes.windll.mpr.WNetAddConnection3W
WNetAddConnection3W.restype = wintypes.DWORD
WNetAddConnection3W.argtypes = [
    wintypes.HANDLE,  # hwndOwner : HWND optional
    ctypes.c_void_p,  # lpNetResource : NETRESOURCEW*
    wintypes.LPCWSTR,  # lpPassword : LPCWSTR optional
    wintypes.LPCWSTR,  # lpUserName : LPCWSTR optional
    wintypes.DWORD,  # dwFlags : NET_CONNECT_FLAGS
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('MPR.dll')
WNetAddConnection3W = Fiddle::Function.new(
  lib['WNetAddConnection3W'],
  [
    Fiddle::TYPE_VOIDP,  # hwndOwner : HWND optional
    Fiddle::TYPE_VOIDP,  # lpNetResource : NETRESOURCEW*
    Fiddle::TYPE_VOIDP,  # lpPassword : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpUserName : LPCWSTR optional
    -Fiddle::TYPE_INT,  # dwFlags : NET_CONNECT_FLAGS
  ],
  -Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "mpr")]
extern "system" {
    fn WNetAddConnection3W(
        hwndOwner: *mut core::ffi::c_void,  // HWND optional
        lpNetResource: *mut NETRESOURCEW,  // NETRESOURCEW*
        lpPassword: *const u16,  // LPCWSTR optional
        lpUserName: *const u16,  // LPCWSTR optional
        dwFlags: u32  // NET_CONNECT_FLAGS
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("MPR.dll", CharSet = CharSet.Unicode)]
public static extern uint WNetAddConnection3W(IntPtr hwndOwner, IntPtr lpNetResource, [MarshalAs(UnmanagedType.LPWStr)] string lpPassword, [MarshalAs(UnmanagedType.LPWStr)] string lpUserName, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MPR_WNetAddConnection3W' -Namespace Win32 -PassThru
# $api::WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
#uselib "MPR.dll"
#func global WNetAddConnection3W "WNetAddConnection3W" wptr, wptr, wptr, wptr, wptr
; WNetAddConnection3W hwndOwner, varptr(lpNetResource), lpPassword, lpUserName, dwFlags   ; 戻り値は stat
; hwndOwner : HWND optional -> "wptr"
; lpNetResource : NETRESOURCEW* -> "wptr"
; lpPassword : LPCWSTR optional -> "wptr"
; lpUserName : LPCWSTR optional -> "wptr"
; dwFlags : NET_CONNECT_FLAGS -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "MPR.dll"
#cfunc global WNetAddConnection3W "WNetAddConnection3W" sptr, var, wstr, wstr, int
; res = WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
; hwndOwner : HWND optional -> "sptr"
; lpNetResource : NETRESOURCEW* -> "var"
; lpPassword : LPCWSTR optional -> "wstr"
; lpUserName : LPCWSTR optional -> "wstr"
; dwFlags : NET_CONNECT_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; WIN32_ERROR WNetAddConnection3W(HWND hwndOwner, NETRESOURCEW* lpNetResource, LPCWSTR lpPassword, LPCWSTR lpUserName, NET_CONNECT_FLAGS dwFlags)
#uselib "MPR.dll"
#cfunc global WNetAddConnection3W "WNetAddConnection3W" intptr, var, wstr, wstr, int
; res = WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
; hwndOwner : HWND optional -> "intptr"
; lpNetResource : NETRESOURCEW* -> "var"
; lpPassword : LPCWSTR optional -> "wstr"
; lpUserName : LPCWSTR optional -> "wstr"
; dwFlags : NET_CONNECT_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	mpr = windows.NewLazySystemDLL("MPR.dll")
	procWNetAddConnection3W = mpr.NewProc("WNetAddConnection3W")
)

// hwndOwner (HWND optional), lpNetResource (NETRESOURCEW*), lpPassword (LPCWSTR optional), lpUserName (LPCWSTR optional), dwFlags (NET_CONNECT_FLAGS)
r1, _, err := procWNetAddConnection3W.Call(
	uintptr(hwndOwner),
	uintptr(lpNetResource),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpPassword))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpUserName))),
	uintptr(dwFlags),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // WIN32_ERROR
function WNetAddConnection3W(
  hwndOwner: THandle;   // HWND optional
  lpNetResource: Pointer;   // NETRESOURCEW*
  lpPassword: PWideChar;   // LPCWSTR optional
  lpUserName: PWideChar;   // LPCWSTR optional
  dwFlags: DWORD   // NET_CONNECT_FLAGS
): DWORD; stdcall;
  external 'MPR.dll' name 'WNetAddConnection3W';
result := DllCall("MPR\WNetAddConnection3W"
    , "Ptr", hwndOwner   ; HWND optional
    , "Ptr", lpNetResource   ; NETRESOURCEW*
    , "WStr", lpPassword   ; LPCWSTR optional
    , "WStr", lpUserName   ; LPCWSTR optional
    , "UInt", dwFlags   ; NET_CONNECT_FLAGS
    , "UInt")   ; return: WIN32_ERROR
●WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags) = DLL("MPR.dll", "dword WNetAddConnection3W(void*, void*, char*, char*, dword)")
# 呼び出し: WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
# hwndOwner : HWND optional -> "void*"
# lpNetResource : NETRESOURCEW* -> "void*"
# lpPassword : LPCWSTR optional -> "char*"
# lpUserName : LPCWSTR optional -> "char*"
# dwFlags : NET_CONNECT_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "mpr" fn WNetAddConnection3W(
    hwndOwner: ?*anyopaque, // HWND optional
    lpNetResource: [*c]NETRESOURCEW, // NETRESOURCEW*
    lpPassword: [*c]const u16, // LPCWSTR optional
    lpUserName: [*c]const u16, // LPCWSTR optional
    dwFlags: u32 // NET_CONNECT_FLAGS
) callconv(std.os.windows.WINAPI) u32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc WNetAddConnection3W(
    hwndOwner: pointer,  # HWND optional
    lpNetResource: ptr NETRESOURCEW,  # NETRESOURCEW*
    lpPassword: WideCString,  # LPCWSTR optional
    lpUserName: WideCString,  # LPCWSTR optional
    dwFlags: uint32  # NET_CONNECT_FLAGS
): uint32 {.importc: "WNetAddConnection3W", stdcall, dynlib: "MPR.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "mpr");
extern(Windows)
uint WNetAddConnection3W(
    void* hwndOwner,   // HWND optional
    NETRESOURCEW* lpNetResource,   // NETRESOURCEW*
    const(wchar)* lpPassword,   // LPCWSTR optional
    const(wchar)* lpUserName,   // LPCWSTR optional
    uint dwFlags   // NET_CONNECT_FLAGS
);
ccall((:WNetAddConnection3W, "MPR.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, Ptr{NETRESOURCEW}, Cwstring, Cwstring, UInt32),
      hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
# hwndOwner : HWND optional -> Ptr{Cvoid}
# lpNetResource : NETRESOURCEW* -> Ptr{NETRESOURCEW}
# lpPassword : LPCWSTR optional -> Cwstring
# lpUserName : LPCWSTR optional -> Cwstring
# dwFlags : NET_CONNECT_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
uint32_t WNetAddConnection3W(
    void* hwndOwner,
    void* lpNetResource,
    const uint16_t* lpPassword,
    const uint16_t* lpUserName,
    uint32_t dwFlags);
]]
local mpr = ffi.load("mpr")
-- mpr.WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
-- hwndOwner : HWND optional
-- lpNetResource : NETRESOURCEW*
-- lpPassword : LPCWSTR optional
-- lpUserName : LPCWSTR optional
-- dwFlags : NET_CONNECT_FLAGS
-- 構造体/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 WNetAddConnection3W = lib.func('__stdcall', 'WNetAddConnection3W', 'uint32_t', ['void *', 'void *', 'str16', 'str16', 'uint32_t']);
// WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
// hwndOwner : HWND optional -> 'void *'
// lpNetResource : NETRESOURCEW* -> 'void *'
// lpPassword : LPCWSTR optional -> 'str16'
// lpUserName : LPCWSTR optional -> 'str16'
// dwFlags : NET_CONNECT_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("MPR.dll", {
  WNetAddConnection3W: { parameters: ["pointer", "pointer", "buffer", "buffer", "u32"], result: "u32" },
});
// lib.symbols.WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
// hwndOwner : HWND optional -> "pointer"
// lpNetResource : NETRESOURCEW* -> "pointer"
// lpPassword : LPCWSTR optional -> "buffer"
// lpUserName : LPCWSTR optional -> "buffer"
// dwFlags : NET_CONNECT_FLAGS -> "u32"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t WNetAddConnection3W(
    void* hwndOwner,
    void* lpNetResource,
    const uint16_t* lpPassword,
    const uint16_t* lpUserName,
    uint32_t dwFlags);
C, "MPR.dll");
// $ffi->WNetAddConnection3W(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags);
// hwndOwner : HWND optional
// lpNetResource : NETRESOURCEW*
// lpPassword : LPCWSTR optional
// lpUserName : LPCWSTR optional
// dwFlags : NET_CONNECT_FLAGS
// 構造体/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 WNetAddConnection3W(
        Pointer hwndOwner,   // HWND optional
        Pointer lpNetResource,   // NETRESOURCEW*
        WString lpPassword,   // LPCWSTR optional
        WString lpUserName,   // LPCWSTR optional
        int dwFlags   // NET_CONNECT_FLAGS
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("mpr")]
lib LibMPR
  fun WNetAddConnection3W = WNetAddConnection3W(
    hwndOwner : Void*,   # HWND optional
    lpNetResource : NETRESOURCEW*,   # NETRESOURCEW*
    lpPassword : UInt16*,   # LPCWSTR optional
    lpUserName : UInt16*,   # LPCWSTR optional
    dwFlags : UInt32   # NET_CONNECT_FLAGS
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef WNetAddConnection3WNative = Uint32 Function(Pointer<Void>, Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Uint32);
typedef WNetAddConnection3WDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, int);
final WNetAddConnection3W = DynamicLibrary.open('MPR.dll')
    .lookupFunction<WNetAddConnection3WNative, WNetAddConnection3WDart>('WNetAddConnection3W');
// hwndOwner : HWND optional -> Pointer<Void>
// lpNetResource : NETRESOURCEW* -> Pointer<Void>
// lpPassword : LPCWSTR optional -> Pointer<Utf16>
// lpUserName : LPCWSTR optional -> Pointer<Utf16>
// dwFlags : NET_CONNECT_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WNetAddConnection3W(
  hwndOwner: THandle;   // HWND optional
  lpNetResource: Pointer;   // NETRESOURCEW*
  lpPassword: PWideChar;   // LPCWSTR optional
  lpUserName: PWideChar;   // LPCWSTR optional
  dwFlags: DWORD   // NET_CONNECT_FLAGS
): DWORD; stdcall;
  external 'MPR.dll' name 'WNetAddConnection3W';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WNetAddConnection3W"
  c_WNetAddConnection3W :: Ptr () -> Ptr () -> CWString -> CWString -> Word32 -> IO Word32
-- hwndOwner : HWND optional -> Ptr ()
-- lpNetResource : NETRESOURCEW* -> Ptr ()
-- lpPassword : LPCWSTR optional -> CWString
-- lpUserName : LPCWSTR optional -> CWString
-- dwFlags : NET_CONNECT_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let wnetaddconnection3w =
  foreign "WNetAddConnection3W"
    ((ptr void) @-> (ptr void) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> uint32_t @-> returning uint32_t)
(* hwndOwner : HWND optional -> (ptr void) *)
(* lpNetResource : NETRESOURCEW* -> (ptr void) *)
(* lpPassword : LPCWSTR optional -> (ptr uint16_t) *)
(* lpUserName : LPCWSTR optional -> (ptr uint16_t) *)
(* dwFlags : NET_CONNECT_FLAGS -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library mpr (t "MPR.dll"))
(cffi:use-foreign-library mpr)

(cffi:defcfun ("WNetAddConnection3W" wnet-add-connection3-w :convention :stdcall) :uint32
  (hwnd-owner :pointer)   ; HWND optional
  (lp-net-resource :pointer)   ; NETRESOURCEW*
  (lp-password (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lp-user-name (:string :encoding :utf-16le))   ; LPCWSTR optional
  (dw-flags :uint32))   ; NET_CONNECT_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WNetAddConnection3W = Win32::API::More->new('MPR',
    'DWORD WNetAddConnection3W(HANDLE hwndOwner, LPVOID lpNetResource, LPCWSTR lpPassword, LPCWSTR lpUserName, DWORD dwFlags)');
# my $ret = $WNetAddConnection3W->Call($hwndOwner, $lpNetResource, $lpPassword, $lpUserName, $dwFlags);
# hwndOwner : HWND optional -> HANDLE
# lpNetResource : NETRESOURCEW* -> LPVOID
# lpPassword : LPCWSTR optional -> LPCWSTR
# lpUserName : LPCWSTR optional -> LPCWSTR
# dwFlags : NET_CONNECT_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

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