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

WNetAddConnection2A

関数
資格情報を指定してネットワークリソースに接続する(ANSI版)。
DLLMPR.dll文字セットANSI (-A)呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// MPR.dll  (ANSI / -A)
#include <windows.h>

WIN32_ERROR WNetAddConnection2A(
    NETRESOURCEA* lpNetResource,
    LPCSTR lpPassword,   // optional
    LPCSTR lpUserName,   // optional
    NET_CONNECT_FLAGS dwFlags
);

パラメーター

名前型方向説明
lpNetResourceNETRESOURCEA*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 でない場合、オペレーティングシステムは指定されたネットワークプロバイダーに対してのみ接続を試みます。

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

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

lpPasswordLPCSTRinoptional

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

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

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

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

Windows Me/98/95: このパラメーターは NULL または空の文字列でなければなりません。

lpUserNameLPCSTRinoptional

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

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

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

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

Windows Me/98/95: このパラメーターは NULL または空の文字列でなければなりません。

dwFlagsNET_CONNECT_FLAGSin

接続オプションのセット。接続オプションに指定できる値は Winnetwk.h ヘッダーファイルで定義されています。 現在、次の値を使用できます。

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

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

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

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

CONNECT_UPDATE_RECENT
0x00000002
ネットワークリソースへの接続を最近使用した接続の一覧に追加しません。

このフラグが設定されていて接続の追加に成功した場合、ネットワークリソースへの接続が最近使用した接続の一覧に追加されるのは、リダイレクトされたローカルデバイスが関連付けられている場合のみです。

CONNECT_TEMPORARY
0x00000004
ネットワークリソースへの接続を記憶しません。

このフラグが設定されている場合、オペレーティングシステムは次にユーザーがログオンしたときに接続を復元しようとしません。

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

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

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

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

CONNECT_CURRENT_MEDIA
0x00000200
このフラグが設定されている場合、オペレーティングシステムは接続を確立するために新しいメディアの使用を開始しません (たとえば、新しいダイヤルアップ接続を開始しません)。
CONNECT_COMMANDLINE
0x00000800
このフラグが設定されている場合、オペレーティングシステムはグラフィカルユーザーインターフェイス (GUI) ではなくコマンドラインを使用してユーザーに認証を求めます。CONNECT_INTERACTIVE も設定されていない限り、このフラグは無視されます。

Windows XP: この値は Windows XP 以降でサポートされます。

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

Windows XP: この値は Windows XP 以降でサポートされます。

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

Windows Vista: この値は Windows Vista 以降でサポートされます。

戻り値の型: WIN32_ERROR

公式ドキュメント

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

戻り値

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

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

戻り値 説明
ERROR_ACCESS_DENIED
呼び出し元にはそのネットワークリソースへのアクセス権がありません。
ERROR_ALREADY_ASSIGNED
lpLocalName メンバーで指定されたローカルデバイスは、既にネットワークリソースに接続されています。
ERROR_BAD_DEV_TYPE
ローカルデバイスの種類とネットワークリソースの種類が一致しません。
ERROR_BAD_DEVICE
指定されたデバイス名が有効ではありません。このエラーは、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpLocalName メンバーが、リダイレクトできないデバイスを指定している場合に返されます。
ERROR_BAD_NET_NAME
ネットワーク名が見つかりません。この値は、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpRemoteName メンバーが、リソース名が空である、有効でない、または名前で指定されたリソースが見つからないなどの理由で、いずれのネットワークリソースプロバイダーにも受け入れられないリソースを指定している場合に返されます。
ERROR_BAD_PROFILE
ユーザープロファイルの形式が正しくありません。
ERROR_BAD_PROVIDER
指定されたネットワークプロバイダー名が有効ではありません。このエラーは、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpProvider メンバーが、どのネットワークプロバイダーにも一致しない値を指定している場合に返されます。
ERROR_BAD_USERNAME
指定されたユーザー名が有効ではありません。
ERROR_BUSY
ルーターまたはプロバイダーがビジー状態です。初期化中の可能性があります。呼び出し元は再試行してください。
ERROR_CANCELLED
接続の試行が、いずれかのネットワークリソースプロバイダーのダイアログボックスを通じてユーザーによって、または呼び出されたリソースによって取り消されました。
ERROR_CANNOT_OPEN_PROFILE
システムは、永続的な接続を処理するためにユーザープロファイルを開くことができません。
ERROR_DEVICE_ALREADY_REMEMBERED
そのローカルデバイス名には、別のネットワークリソースへの記憶された接続があります。このエラーは、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpLocalName メンバーで指定されたデバイスのエントリが、 lpNetResource パラメーターで指定された接続とは異なる接続として、既にユーザープロファイルに存在する場合に返されます。
ERROR_EXTENDED_ERROR
ネットワーク固有のエラーが発生しました。 WNetGetLastError 関数を呼び出して、エラーの説明を取得してください。
ERROR_INVALID_ADDRESS
無効なアドレスにアクセスしようとしました。このエラーは、dwFlags パラメーターに CONNECT_REDIRECT が指定されているにもかかわらず、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpLocalName メンバーが指定されていない場合に返されます。
ERROR_INVALID_PARAMETER
パラメーターが正しくありません。このエラーは、lpNetResource パラメーターが指す NETRESOURCE 構造体の dwType メンバーに RESOURCETYPE_DISK、RESOURCETYPE_PRINT、RESOURCETYPE_ANY 以外の値が指定されている場合に返されます。また、dwFlags パラメーターに正しくない値または不明な値が指定されている場合にも返されます。
ERROR_INVALID_PASSWORD
指定されたパスワードが無効で、かつ CONNECT_INTERACTIVE フラグが設定されていません。
ERROR_LOGON_FAILURE
不明なユーザー名または誤ったパスワードによるログオンの失敗です。
ERROR_NO_NET_OR_BAD_PATH
指定されたネットワークパスを受け入れたネットワークプロバイダーがありませんでした。このエラーは、lpNetResource パラメーターが指す NETRESOURCE 構造体の lpRemoteName メンバーをどのネットワークプロバイダーも認識しなかった場合に返されます。
ERROR_NO_NETWORK
ネットワークが利用できません。
その他
FormatMessage を使用して、返されたエラーのメッセージ文字列を取得してください。

解説(Remarks)

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

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

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

例

次のコードサンプルは、 WNetAddConnection2 関数を使用してネットワークリソースへの接続を確立する方法を示しています。

#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "mpr.lib")

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <Winnetwk.h>

// Netapi32.lib と Mpr.lib をリンクする必要がある

int wmain(int argc, wchar_t * argv[])
{

    DWORD dwRetVal;

    NETRESOURCE nr;
    DWORD dwFlags;

    if (argc != 5) {
        wprintf(L"Usage: %s <localname> <remotename> <username> <password>\n",
                argv[0]);
        wprintf(L"       %s X: \\\\contoso\\public testuser testpasswd\n",
                argv[0]);
        exit(1);
    }

    wprintf(L"Calling WNetAddConnection2 with\n");
    wprintf(L"  lpLocalName = %s\n", argv[1]);
    wprintf(L"  lpRemoteName = %s\n", argv[2]);
    wprintf(L"  lpUsername = %s\n", argv[3]);
    wprintf(L"  lpPassword = %s\n", argv[4]);

// NETRESOURCE 構造体をゼロで初期化する
    memset(&nr, 0, sizeof (NETRESOURCE));

// NETRESOURCE 構造体に値を設定する。

    nr.dwType = RESOURCETYPE_ANY;
    nr.lpLocalName = argv[1];
    nr.lpRemoteName = argv[2];
    nr.lpProvider = NULL;

// 接続オプションに値を設定する
    dwFlags = CONNECT_UPDATE_PROFILE;
//
// WNetAddConnection2 関数を呼び出して、共有に
//   ドライブ文字を割り当てる。
//
    dwRetVal = WNetAddConnection2(&nr, argv[4], argv[3], dwFlags);
//
// 呼び出しが成功した場合はユーザーに通知し、失敗した場合は
//  エラーを表示する。
//
    if (dwRetVal == NO_ERROR)
        wprintf(L"Connection added to %s\n", nr.lpRemoteName);
    else
        wprintf(L"WNetAddConnection2 failed with error: %u\n", dwRetVal);

    exit(1); 
}

WNetAddConnection2 関数を使用してネットワークリソースへ接続する方法を示すその他のコードサンプルについては、 ネットワーク接続の追加 および 共有へのドライブの割り当て を参照してください。

メモ

winnetwk.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして WNetAddConnection2 を定義しています。エンコーディング中立のエイリアスの使用を、エンコーディング中立でないコードと混在させると、不一致が生じてコンパイルエラーや実行時エラーの原因となることがあります。詳細については、関数プロトタイプの規則 を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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 WNetAddConnection2A(
    NETRESOURCEA* lpNetResource,
    LPCSTR lpPassword,   // optional
    LPCSTR lpUserName,   // optional
    NET_CONNECT_FLAGS dwFlags
);
[DllImport("MPR.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern uint WNetAddConnection2A(
    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 WNetAddConnection2A(
    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
' lpNetResource : NETRESOURCEA*
' lpPassword : LPCSTR optional
' lpUserName : LPCSTR optional
' dwFlags : NET_CONNECT_FLAGS
Declare PtrSafe Function WNetAddConnection2A Lib "mpr" ( _
    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

WNetAddConnection2A = ctypes.windll.mpr.WNetAddConnection2A
WNetAddConnection2A.restype = wintypes.DWORD
WNetAddConnection2A.argtypes = [
    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')
WNetAddConnection2A = Fiddle::Function.new(
  lib['WNetAddConnection2A'],
  [
    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 WNetAddConnection2A(
        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 WNetAddConnection2A(IntPtr lpNetResource, [MarshalAs(UnmanagedType.LPStr)] string lpPassword, [MarshalAs(UnmanagedType.LPStr)] string lpUserName, uint dwFlags);
"@
$api = Add-Type -MemberDefinition $sig -Name 'MPR_WNetAddConnection2A' -Namespace Win32 -PassThru
# $api::WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
#uselib "MPR.dll"
#func global WNetAddConnection2A "WNetAddConnection2A" sptr, sptr, sptr, sptr
; WNetAddConnection2A varptr(lpNetResource), lpPassword, lpUserName, dwFlags   ; 戻り値は stat
; 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 WNetAddConnection2A "WNetAddConnection2A" var, str, str, int
; res = WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
; lpNetResource : NETRESOURCEA* -> "var"
; lpPassword : LPCSTR optional -> "str"
; lpUserName : LPCSTR optional -> "str"
; dwFlags : NET_CONNECT_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; WIN32_ERROR WNetAddConnection2A(NETRESOURCEA* lpNetResource, LPCSTR lpPassword, LPCSTR lpUserName, NET_CONNECT_FLAGS dwFlags)
#uselib "MPR.dll"
#cfunc global WNetAddConnection2A "WNetAddConnection2A" var, str, str, int
; res = WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
; lpNetResource : NETRESOURCEA* -> "var"
; lpPassword : LPCSTR optional -> "str"
; lpUserName : LPCSTR optional -> "str"
; dwFlags : NET_CONNECT_FLAGS -> "int"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	mpr = windows.NewLazySystemDLL("MPR.dll")
	procWNetAddConnection2A = mpr.NewProc("WNetAddConnection2A")
)

// lpNetResource (NETRESOURCEA*), lpPassword (LPCSTR optional), lpUserName (LPCSTR optional), dwFlags (NET_CONNECT_FLAGS)
r1, _, err := procWNetAddConnection2A.Call(
	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_ERROR
function WNetAddConnection2A(
  lpNetResource: Pointer;   // NETRESOURCEA*
  lpPassword: PAnsiChar;   // LPCSTR optional
  lpUserName: PAnsiChar;   // LPCSTR optional
  dwFlags: DWORD   // NET_CONNECT_FLAGS
): DWORD; stdcall;
  external 'MPR.dll' name 'WNetAddConnection2A';
result := DllCall("MPR\WNetAddConnection2A"
    , "Ptr", lpNetResource   ; NETRESOURCEA*
    , "AStr", lpPassword   ; LPCSTR optional
    , "AStr", lpUserName   ; LPCSTR optional
    , "UInt", dwFlags   ; NET_CONNECT_FLAGS
    , "UInt")   ; return: WIN32_ERROR
●WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags) = DLL("MPR.dll", "dword WNetAddConnection2A(void*, char*, char*, dword)")
# 呼び出し: WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
# 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 WNetAddConnection2A(
    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 WNetAddConnection2A(
    lpNetResource: ptr NETRESOURCEA,  # NETRESOURCEA*
    lpPassword: cstring,  # LPCSTR optional
    lpUserName: cstring,  # LPCSTR optional
    dwFlags: uint32  # NET_CONNECT_FLAGS
): uint32 {.importc: "WNetAddConnection2A", stdcall, dynlib: "MPR.dll".}
pragma(lib, "mpr");
extern(Windows)
uint WNetAddConnection2A(
    NETRESOURCEA* lpNetResource,   // NETRESOURCEA*
    const(char)* lpPassword,   // LPCSTR optional
    const(char)* lpUserName,   // LPCSTR optional
    uint dwFlags   // NET_CONNECT_FLAGS
);
ccall((:WNetAddConnection2A, "MPR.dll"), stdcall, UInt32,
      (Ptr{NETRESOURCEA}, Cstring, Cstring, UInt32),
      lpNetResource, lpPassword, lpUserName, dwFlags)
# 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 WNetAddConnection2A(
    void* lpNetResource,
    const char* lpPassword,
    const char* lpUserName,
    uint32_t dwFlags);
]]
local mpr = ffi.load("mpr")
-- mpr.WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
-- 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 WNetAddConnection2A = lib.func('__stdcall', 'WNetAddConnection2A', 'uint32_t', ['void *', 'str', 'str', 'uint32_t']);
// WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
// 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", {
  WNetAddConnection2A: { parameters: ["pointer", "buffer", "buffer", "u32"], result: "u32" },
});
// lib.symbols.WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags)
// 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 WNetAddConnection2A(
    void* lpNetResource,
    const char* lpPassword,
    const char* lpUserName,
    uint32_t dwFlags);
C, "MPR.dll");
// $ffi->WNetAddConnection2A(lpNetResource, lpPassword, lpUserName, dwFlags);
// 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 WNetAddConnection2A(
        Pointer lpNetResource,   // NETRESOURCEA*
        String lpPassword,   // LPCSTR optional
        String lpUserName,   // LPCSTR optional
        int dwFlags   // NET_CONNECT_FLAGS
    );
}
@[Link("mpr")]
lib LibMPR
  fun WNetAddConnection2A = WNetAddConnection2A(
    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 WNetAddConnection2ANative = Uint32 Function(Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Uint32);
typedef WNetAddConnection2ADart = int Function(Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, int);
final WNetAddConnection2A = DynamicLibrary.open('MPR.dll')
    .lookupFunction<WNetAddConnection2ANative, WNetAddConnection2ADart>('WNetAddConnection2A');
// 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 WNetAddConnection2A(
  lpNetResource: Pointer;   // NETRESOURCEA*
  lpPassword: PAnsiChar;   // LPCSTR optional
  lpUserName: PAnsiChar;   // LPCSTR optional
  dwFlags: DWORD   // NET_CONNECT_FLAGS
): DWORD; stdcall;
  external 'MPR.dll' name 'WNetAddConnection2A';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WNetAddConnection2A"
  c_WNetAddConnection2A :: Ptr () -> CString -> CString -> Word32 -> IO Word32
-- 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 wnetaddconnection2a =
  foreign "WNetAddConnection2A"
    ((ptr void) @-> string @-> string @-> uint32_t @-> returning uint32_t)
(* 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 ("WNetAddConnection2A" wnet-add-connection2-a :convention :stdcall) :uint32
  (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 $WNetAddConnection2A = Win32::API::More->new('MPR',
    'DWORD WNetAddConnection2A(LPVOID lpNetResource, LPCSTR lpPassword, LPCSTR lpUserName, DWORD dwFlags)');
# my $ret = $WNetAddConnection2A->Call($lpNetResource, $lpPassword, $lpUserName, $dwFlags);
# lpNetResource : NETRESOURCEA* -> LPVOID
# lpPassword : LPCSTR optional -> LPCSTR
# lpUserName : LPCSTR optional -> LPCSTR
# dwFlags : NET_CONNECT_FLAGS -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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