WNetAddConnection3A
関数シグネチャ
// MPR.dll (ANSI / -A)
#include <windows.h>
WIN32_ERROR WNetAddConnection3A(
HWND hwndOwner, // optional
NETRESOURCEA* lpNetResource,
LPCSTR lpPassword, // optional
LPCSTR lpUserName, // optional
NET_CONNECT_FLAGS dwFlags
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hwndOwner | HWND | inoptional | ネットワークリソースのプロバイダーがダイアログボックスのオーナーウィンドウとして使用できるウィンドウへのハンドルです。dwFlags パラメーターに CONNECT_INTERACTIVE 値を設定する場合は、このパラメーターを使用します。 hwndOwner パラメーターには NULL を指定できます。その場合、 WNetAddConnection3 の呼び出しは WNetAddConnection2 関数を呼び出す場合と等価になります。 | ||||||||||||||
| lpNetResource | NETRESOURCEA* | in | ネットワークリソース、ローカルデバイス、ネットワークリソースプロバイダーに関する情報など、確立しようとする接続の詳細を指定する NETRESOURCE 構造体へのポインターです。 NETRESOURCE 構造体の次のメンバーを指定する必要があります。
WNetAddConnection3 関数は、 NETRESOURCE 構造体のその他のメンバーを無視します。 | ||||||||||||||
| lpPassword | LPCSTR | inoptional | ネットワーク接続の確立に使用するパスワードを指定する null 終端文字列へのポインターです。 lpPassword が NULL の場合、この関数は lpUserName パラメーターで指定されたユーザーに関連付けられている、現在の既定のパスワードを使用します。 lpPassword が空の文字列を指している場合、この関数はパスワードを使用しません。 パスワードが無効なために接続が失敗し、かつ dwFlags パラメーターに CONNECT_INTERACTIVE 値が設定されている場合、この関数はパスワードの入力をユーザーに求めるダイアログボックスを表示します。 Windows Me/98/95: このパラメーターは NULL または空の文字列である必要があります。 | ||||||||||||||
| lpUserName | LPCSTR | inoptional | 接続の確立に使用するユーザー名を指定する null 終端文字列へのポインターです。 lpUserName が NULL の場合、この関数は既定のユーザー名を使用します (既定のユーザー名は、プロセスのユーザーコンテキストによって決まります)。 lpUserName パラメーターは、既定のユーザー名またはアカウント以外のユーザー名またはアカウントが割り当てられているネットワークリソースに接続する場合に指定します。 ユーザー名文字列は セキュリティコンテキストを表します。これはネットワークプロバイダーに固有の場合があります。 Windows Me/98/95: このパラメーターは NULL または空の文字列である必要があります。 | ||||||||||||||
| dwFlags | NET_CONNECT_FLAGS | in | 接続オプションのセットです。現在、次の値が定義されています。
|
戻り値の型: WIN32_ERROR
公式ドキュメント
WNetAddConnection3 関数は、ネットワークリソースへの接続を確立します。この関数は、ローカルデバイスをネットワークリソースにリダイレクトできます。(ANSI)
戻り値
関数が成功した場合、戻り値は NO_ERROR です。
関数が失敗した場合、戻り値は システムエラーコードであり、たとえば次のいずれかの値になります。
| 戻り値 | 説明 |
|---|---|
| 呼び出し元にネットワークリソースへのアクセス権がありません。 | |
| lpLocalName メンバーで指定されたローカルデバイスは、既にネットワークリソースに接続されています。 | |
| ローカルデバイスの種類とネットワークリソースの種類が一致しません。 | |
| lpLocalName で指定された値が無効です。 | |
| lpRemoteName メンバーで指定された値は、リソース名が無効であるか、名前で指定されたリソースが見つからないため、どのネットワークリソースプロバイダーにも受け入れられません。 | |
| ユーザープロファイルの形式が正しくありません。 | |
| lpProvider メンバーで指定された値が、どのプロバイダーにも一致しません。 | |
| ルーターまたはプロバイダーがビジー状態です (初期化中の可能性があります)。呼び出し元は再試行してください。 | |
| 接続の試行が、いずれかのネットワークリソースプロバイダーのダイアログボックスを通じてユーザーによって、または呼び出されたリソースによってキャンセルされました。 | |
| 永続的な接続を処理するためのユーザープロファイルをシステムが開けません。 | |
| lpLocalName メンバーで指定されたデバイスのエントリが、既にユーザープロファイルに存在します。 | |
| ネットワーク固有のエラーが発生しました。エラーの説明を取得するには、 WNetGetLastError 関数を呼び出してください。 | |
| 指定されたパスワードが無効で、CONNECT_INTERACTIVE フラグが設定されていません。 | |
| ネットワークコンポーネントが開始されていないか、指定された名前が使用できないため、操作を実行できません。 | |
| ネットワークが利用できません。 |
解説(Remarks)
WNetUseConnection 関数は WNetAddConnection3 関数に似ています。主な違いは、 WNetUseConnection がネットワークリソースへのリダイレクト先として未使用のローカルデバイスを自動的に選択できる点です。
Windows Server 2003 および Windows XP では、MS-DOS デバイスは AuthenticationID (ログオンセッションに関連付けられた ローカル一意識別子 (LUID)) によって識別されるため、WNet 関数はログオンセッションに関連付けられた MS-DOS デバイス名前空間内にネットワークドライブ文字を作成および削除します。このことは、あるユーザーログオンで WNet 関数のいずれかを呼び出してネットワークドライブ文字を作成し、別のユーザーログオンで既存のネットワークドライブ文字を照会するアプリケーションに影響する可能性があります。この状況の例としては、ログオンセッション内でユーザーの 2 つ目のログオンが作成され (たとえば CreateProcessAsUser 関数の呼び出しによって)、その 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 アドレスの ':' 文字を '-' 文字に置き換え、その後に ".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 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// MPR.dll (ANSI / -A)
#include <windows.h>
WIN32_ERROR WNetAddConnection3A(
HWND hwndOwner, // optional
NETRESOURCEA* lpNetResource,
LPCSTR lpPassword, // optional
LPCSTR lpUserName, // optional
NET_CONNECT_FLAGS dwFlags
);[DllImport("MPR.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint WNetAddConnection3A(
IntPtr hwndOwner, // HWND optional
IntPtr lpNetResource, // NETRESOURCEA*
[MarshalAs(UnmanagedType.LPStr)] string lpPassword, // LPCSTR optional
[MarshalAs(UnmanagedType.LPStr)] string lpUserName, // LPCSTR optional
uint dwFlags // NET_CONNECT_FLAGS
);<DllImport("MPR.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function WNetAddConnection3A(
hwndOwner As IntPtr, ' HWND optional
lpNetResource As IntPtr, ' NETRESOURCEA*
<MarshalAs(UnmanagedType.LPStr)> lpPassword As String, ' LPCSTR optional
<MarshalAs(UnmanagedType.LPStr)> lpUserName As String, ' LPCSTR optional
dwFlags As UInteger ' NET_CONNECT_FLAGS
) As UInteger
End Function' hwndOwner : HWND optional
' lpNetResource : NETRESOURCEA*
' lpPassword : LPCSTR optional
' lpUserName : LPCSTR optional
' dwFlags : NET_CONNECT_FLAGS
Declare PtrSafe Function WNetAddConnection3A Lib "mpr" ( _
ByVal hwndOwner As LongPtr, _
ByVal lpNetResource As LongPtr, _
ByVal lpPassword As String, _
ByVal lpUserName As String, _
ByVal dwFlags As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
WNetAddConnection3A = ctypes.windll.mpr.WNetAddConnection3A
WNetAddConnection3A.restype = wintypes.DWORD
WNetAddConnection3A.argtypes = [
wintypes.HANDLE, # hwndOwner : HWND optional
ctypes.c_void_p, # lpNetResource : NETRESOURCEA*
wintypes.LPCSTR, # lpPassword : LPCSTR optional
wintypes.LPCSTR, # lpUserName : LPCSTR optional
wintypes.DWORD, # dwFlags : NET_CONNECT_FLAGS
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('MPR.dll')
WNetAddConnection3A = Fiddle::Function.new(
lib['WNetAddConnection3A'],
[
Fiddle::TYPE_VOIDP, # hwndOwner : HWND optional
Fiddle::TYPE_VOIDP, # lpNetResource : NETRESOURCEA*
Fiddle::TYPE_VOIDP, # lpPassword : LPCSTR optional
Fiddle::TYPE_VOIDP, # lpUserName : LPCSTR optional
-Fiddle::TYPE_INT, # dwFlags : NET_CONNECT_FLAGS
],
-Fiddle::TYPE_INT)#[link(name = "mpr")]
extern "system" {
fn WNetAddConnection3A(
hwndOwner: *mut core::ffi::c_void, // HWND optional
lpNetResource: *mut NETRESOURCEA, // NETRESOURCEA*
lpPassword: *const u8, // LPCSTR optional
lpUserName: *const u8, // LPCSTR optional
dwFlags: u32 // NET_CONNECT_FLAGS
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("MPR.dll", CharSet = CharSet.Ansi)]
public static extern uint WNetAddConnection3A(IntPtr hwndOwner, IntPtr lpNetResource, [MarshalAs(UnmanagedType.LPStr)] string lpPassword, [MarshalAs(UnmanagedType.LPStr)] string lpUserName, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MPR_WNetAddConnection3A' -Namespace Win32 -PassThru
# $api::WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)#uselib "MPR.dll"
#func global WNetAddConnection3A "WNetAddConnection3A" sptr, sptr, sptr, sptr, sptr
; WNetAddConnection3A hwndOwner, varptr(lpNetResource), lpPassword, lpUserName, dwFlags ; 戻り値は stat
; hwndOwner : HWND optional -> "sptr"
; lpNetResource : NETRESOURCEA* -> "sptr"
; lpPassword : LPCSTR optional -> "sptr"
; lpUserName : LPCSTR optional -> "sptr"
; dwFlags : NET_CONNECT_FLAGS -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "MPR.dll" #cfunc global WNetAddConnection3A "WNetAddConnection3A" sptr, var, str, str, int ; res = WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags) ; hwndOwner : HWND optional -> "sptr" ; lpNetResource : NETRESOURCEA* -> "var" ; lpPassword : LPCSTR optional -> "str" ; lpUserName : LPCSTR optional -> "str" ; dwFlags : NET_CONNECT_FLAGS -> "int" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "MPR.dll" #cfunc global WNetAddConnection3A "WNetAddConnection3A" sptr, sptr, str, str, int ; res = WNetAddConnection3A(hwndOwner, varptr(lpNetResource), lpPassword, lpUserName, dwFlags) ; hwndOwner : HWND optional -> "sptr" ; lpNetResource : NETRESOURCEA* -> "sptr" ; lpPassword : LPCSTR optional -> "str" ; lpUserName : LPCSTR optional -> "str" ; dwFlags : NET_CONNECT_FLAGS -> "int" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; WIN32_ERROR WNetAddConnection3A(HWND hwndOwner, NETRESOURCEA* lpNetResource, LPCSTR lpPassword, LPCSTR lpUserName, NET_CONNECT_FLAGS dwFlags) #uselib "MPR.dll" #cfunc global WNetAddConnection3A "WNetAddConnection3A" intptr, var, str, str, int ; res = WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags) ; hwndOwner : HWND optional -> "intptr" ; lpNetResource : NETRESOURCEA* -> "var" ; lpPassword : LPCSTR optional -> "str" ; lpUserName : LPCSTR optional -> "str" ; dwFlags : NET_CONNECT_FLAGS -> "int" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; WIN32_ERROR WNetAddConnection3A(HWND hwndOwner, NETRESOURCEA* lpNetResource, LPCSTR lpPassword, LPCSTR lpUserName, NET_CONNECT_FLAGS dwFlags) #uselib "MPR.dll" #cfunc global WNetAddConnection3A "WNetAddConnection3A" intptr, intptr, str, str, int ; res = WNetAddConnection3A(hwndOwner, varptr(lpNetResource), lpPassword, lpUserName, dwFlags) ; hwndOwner : HWND optional -> "intptr" ; lpNetResource : NETRESOURCEA* -> "intptr" ; lpPassword : LPCSTR optional -> "str" ; lpUserName : LPCSTR optional -> "str" ; dwFlags : NET_CONNECT_FLAGS -> "int" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
mpr = windows.NewLazySystemDLL("MPR.dll")
procWNetAddConnection3A = mpr.NewProc("WNetAddConnection3A")
)
// hwndOwner (HWND optional), lpNetResource (NETRESOURCEA*), lpPassword (LPCSTR optional), lpUserName (LPCSTR optional), dwFlags (NET_CONNECT_FLAGS)
r1, _, err := procWNetAddConnection3A.Call(
uintptr(hwndOwner),
uintptr(lpNetResource),
uintptr(unsafe.Pointer(windows.BytePtrFromString(lpPassword))),
uintptr(unsafe.Pointer(windows.BytePtrFromString(lpUserName))),
uintptr(dwFlags),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // WIN32_ERRORfunction WNetAddConnection3A(
hwndOwner: THandle; // HWND optional
lpNetResource: Pointer; // NETRESOURCEA*
lpPassword: PAnsiChar; // LPCSTR optional
lpUserName: PAnsiChar; // LPCSTR optional
dwFlags: DWORD // NET_CONNECT_FLAGS
): DWORD; stdcall;
external 'MPR.dll' name 'WNetAddConnection3A';result := DllCall("MPR\WNetAddConnection3A"
, "Ptr", hwndOwner ; HWND optional
, "Ptr", lpNetResource ; NETRESOURCEA*
, "AStr", lpPassword ; LPCSTR optional
, "AStr", lpUserName ; LPCSTR optional
, "UInt", dwFlags ; NET_CONNECT_FLAGS
, "UInt") ; return: WIN32_ERROR●WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags) = DLL("MPR.dll", "dword WNetAddConnection3A(void*, void*, char*, char*, dword)")
# 呼び出し: WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
# hwndOwner : HWND optional -> "void*"
# lpNetResource : NETRESOURCEA* -> "void*"
# lpPassword : LPCSTR optional -> "char*"
# lpUserName : LPCSTR optional -> "char*"
# dwFlags : NET_CONNECT_FLAGS -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "mpr" fn WNetAddConnection3A(
hwndOwner: ?*anyopaque, // HWND optional
lpNetResource: [*c]NETRESOURCEA, // NETRESOURCEA*
lpPassword: [*c]const u8, // LPCSTR optional
lpUserName: [*c]const u8, // LPCSTR optional
dwFlags: u32 // NET_CONNECT_FLAGS
) callconv(std.os.windows.WINAPI) u32;proc WNetAddConnection3A(
hwndOwner: pointer, # HWND optional
lpNetResource: ptr NETRESOURCEA, # NETRESOURCEA*
lpPassword: cstring, # LPCSTR optional
lpUserName: cstring, # LPCSTR optional
dwFlags: uint32 # NET_CONNECT_FLAGS
): uint32 {.importc: "WNetAddConnection3A", stdcall, dynlib: "MPR.dll".}pragma(lib, "mpr");
extern(Windows)
uint WNetAddConnection3A(
void* hwndOwner, // HWND optional
NETRESOURCEA* lpNetResource, // NETRESOURCEA*
const(char)* lpPassword, // LPCSTR optional
const(char)* lpUserName, // LPCSTR optional
uint dwFlags // NET_CONNECT_FLAGS
);ccall((:WNetAddConnection3A, "MPR.dll"), stdcall, UInt32,
(Ptr{Cvoid}, Ptr{NETRESOURCEA}, Cstring, Cstring, UInt32),
hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
# hwndOwner : HWND optional -> Ptr{Cvoid}
# lpNetResource : NETRESOURCEA* -> Ptr{NETRESOURCEA}
# lpPassword : LPCSTR optional -> Cstring
# lpUserName : LPCSTR optional -> Cstring
# dwFlags : NET_CONNECT_FLAGS -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t WNetAddConnection3A(
void* hwndOwner,
void* lpNetResource,
const char* lpPassword,
const char* lpUserName,
uint32_t dwFlags);
]]
local mpr = ffi.load("mpr")
-- mpr.WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
-- hwndOwner : HWND optional
-- lpNetResource : NETRESOURCEA*
-- lpPassword : LPCSTR optional
-- lpUserName : LPCSTR optional
-- dwFlags : NET_CONNECT_FLAGS
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('MPR.dll');
const WNetAddConnection3A = lib.func('__stdcall', 'WNetAddConnection3A', 'uint32_t', ['void *', 'void *', 'str', 'str', 'uint32_t']);
// WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
// hwndOwner : HWND optional -> 'void *'
// lpNetResource : NETRESOURCEA* -> 'void *'
// lpPassword : LPCSTR optional -> 'str'
// lpUserName : LPCSTR optional -> 'str'
// dwFlags : NET_CONNECT_FLAGS -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("MPR.dll", {
WNetAddConnection3A: { parameters: ["pointer", "pointer", "buffer", "buffer", "u32"], result: "u32" },
});
// lib.symbols.WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags)
// hwndOwner : HWND optional -> "pointer"
// lpNetResource : NETRESOURCEA* -> "pointer"
// lpPassword : LPCSTR optional -> "buffer"
// lpUserName : LPCSTR optional -> "buffer"
// dwFlags : NET_CONNECT_FLAGS -> "u32"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t WNetAddConnection3A(
void* hwndOwner,
void* lpNetResource,
const char* lpPassword,
const char* lpUserName,
uint32_t dwFlags);
C, "MPR.dll");
// $ffi->WNetAddConnection3A(hwndOwner, lpNetResource, lpPassword, lpUserName, dwFlags);
// hwndOwner : HWND optional
// lpNetResource : NETRESOURCEA*
// lpPassword : LPCSTR optional
// lpUserName : LPCSTR 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.ASCII_OPTIONS);
int WNetAddConnection3A(
Pointer hwndOwner, // HWND optional
Pointer lpNetResource, // NETRESOURCEA*
String lpPassword, // LPCSTR optional
String lpUserName, // LPCSTR optional
int dwFlags // NET_CONNECT_FLAGS
);
}@[Link("mpr")]
lib LibMPR
fun WNetAddConnection3A = WNetAddConnection3A(
hwndOwner : Void*, # HWND optional
lpNetResource : NETRESOURCEA*, # NETRESOURCEA*
lpPassword : UInt8*, # LPCSTR optional
lpUserName : UInt8*, # LPCSTR 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 WNetAddConnection3ANative = Uint32 Function(Pointer<Void>, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Uint32);
typedef WNetAddConnection3ADart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, int);
final WNetAddConnection3A = DynamicLibrary.open('MPR.dll')
.lookupFunction<WNetAddConnection3ANative, WNetAddConnection3ADart>('WNetAddConnection3A');
// hwndOwner : HWND optional -> Pointer<Void>
// lpNetResource : NETRESOURCEA* -> Pointer<Void>
// lpPassword : LPCSTR optional -> Pointer<Utf8>
// lpUserName : LPCSTR optional -> Pointer<Utf8>
// dwFlags : NET_CONNECT_FLAGS -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function WNetAddConnection3A(
hwndOwner: THandle; // HWND optional
lpNetResource: Pointer; // NETRESOURCEA*
lpPassword: PAnsiChar; // LPCSTR optional
lpUserName: PAnsiChar; // LPCSTR optional
dwFlags: DWORD // NET_CONNECT_FLAGS
): DWORD; stdcall;
external 'MPR.dll' name 'WNetAddConnection3A';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "WNetAddConnection3A"
c_WNetAddConnection3A :: Ptr () -> Ptr () -> CString -> CString -> Word32 -> IO Word32
-- hwndOwner : HWND optional -> Ptr ()
-- lpNetResource : NETRESOURCEA* -> Ptr ()
-- lpPassword : LPCSTR optional -> CString
-- lpUserName : LPCSTR optional -> CString
-- dwFlags : NET_CONNECT_FLAGS -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let wnetaddconnection3a =
foreign "WNetAddConnection3A"
((ptr void) @-> (ptr void) @-> string @-> string @-> uint32_t @-> returning uint32_t)
(* hwndOwner : HWND optional -> (ptr void) *)
(* lpNetResource : NETRESOURCEA* -> (ptr void) *)
(* lpPassword : LPCSTR optional -> string *)
(* lpUserName : LPCSTR optional -> string *)
(* 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 ("WNetAddConnection3A" wnet-add-connection3-a :convention :stdcall) :uint32
(hwnd-owner :pointer) ; HWND optional
(lp-net-resource :pointer) ; NETRESOURCEA*
(lp-password :string) ; LPCSTR optional
(lp-user-name :string) ; LPCSTR optional
(dw-flags :uint32)) ; NET_CONNECT_FLAGS
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $WNetAddConnection3A = Win32::API::More->new('MPR',
'DWORD WNetAddConnection3A(HANDLE hwndOwner, LPVOID lpNetResource, LPCSTR lpPassword, LPCSTR lpUserName, DWORD dwFlags)');
# my $ret = $WNetAddConnection3A->Call($hwndOwner, $lpNetResource, $lpPassword, $lpUserName, $dwFlags);
# hwndOwner : HWND optional -> HANDLE
# lpNetResource : NETRESOURCEA* -> LPVOID
# lpPassword : LPCSTR optional -> LPCSTR
# lpUserName : LPCSTR optional -> LPCSTR
# dwFlags : NET_CONNECT_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f WNetAddConnection3W (Unicode版) — 所有ウィンドウを指定してネットワークリソースに接続する(Unicode版)。
- f WNetAddConnection2A — 資格情報を指定してネットワークリソースに接続する(ANSI版)。
- f WNetAddConnection4A — 認証バッファを用いてネットワークリソースに接続する(ANSI版)。
- f WNetAddConnectionA — ネットワーク上のリソースへの接続を確立する(ANSI版)。
- f WNetCancelConnection2A — フラグを指定してネットワーク接続を切断する(ANSI版)。
- f WNetGetConnectionA — ローカル名に対応するリモートネットワーク名を取得する(ANSI版)。
- f WNetUseConnectionA — ローカル名割り当てなしでネットワークリソースに接続する(ANSI版)。