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

NetValidateName

関数
指定した名前がコンピューターやドメイン名として有効か検証する。
DLLNETAPI32.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// NETAPI32.dll
#include <windows.h>

DWORD NetValidateName(
    LPCWSTR lpServer,   // optional
    LPCWSTR lpName,
    LPCWSTR lpAccount,   // optional
    LPCWSTR lpPassword,   // optional
    NETSETUP_NAME_TYPE NameType
);

パラメーター

名前方向説明
lpServerLPCWSTRinoptional関数を呼び出す対象コンピューターの DNS 名または NetBIOS 名を指定する定数文字列へのポインター。このパラメーターが NULL の場合、ローカルコンピューターが使用されます。
lpNameLPCWSTRin検証する名前を指定する定数文字列へのポインター。NameType パラメーターで指定された値に応じて、lpName パラメーターはコンピューター名、ワークグループ名、ドメイン名、または DNS コンピューター名を指すことができます。
lpAccountLPCWSTRinoptionallpName パラメーターがドメイン名の場合、このパラメーターはドメインコントローラーへの接続時に使用するアカウント名を指します。文字列には、ドメイン NetBIOS 名とユーザーアカウント(例: "REDMOND\user")か、インターネット形式のログイン名としてのユーザープリンシパル名(UPN、例: "someone@example.com")のいずれかを指定する必要があります。このパラメーターが NULL の場合、呼び出し元のコンテキストが使用されます。
lpPasswordLPCWSTRinoptionallpAccount パラメーターでアカウント名を指定する場合、このパラメーターはドメインコントローラーへの接続時に使用するパスワードを指す必要があります。それ以外の場合、このパラメーターは NULL でなければなりません。
NameTypeNETSETUP_NAME_TYPEin

検証のために lpName パラメーターに渡された名前の種類。このパラメーターには、Lmjoin.h ヘッダーファイルで定義されている NETSETUP_NAME_TYPE 列挙型の値のいずれかを指定できます。

Lmjoin.h ヘッダーは Lm.h ヘッダーファイルによって自動的にインクルードされる点に注意してください。Lmjoin.h ヘッダーファイルを直接使用しないでください。

このパラメーターに指定できる値の一覧を次に示します。

意味
NetSetupUnknown
0
名前の種類が不明です。この値を使用すると、NetValidateName 関数は ERROR_INVALID_PARAMETER で失敗します。
NetSetupMachine
1
NetBIOS コンピューター名が有効であり、かつ使用中でないことを検証します。
NetSetupWorkgroup
2
ワークグループ名が有効であることを検証します。
NetSetupDomain
3
ドメイン名が存在し、かつそれがドメインであることを検証します。
NetSetupNonExistentDomain
4
ドメイン名が使用中でないことを検証します。
NetSetupDnsMachine
5
DNS コンピューター名が有効であることを検証します。

この値は Windows 2000 以降でサポートされます。この値を使用するには、アプリケーションを _WIN32_WINNT >= 0x0500 でコンパイルする必要があります。

戻り値の型: DWORD

公式ドキュメント

NetValidateName 関数は、指定された名前の種類(コンピューター名、ワークグループ名、ドメイン名、または DNS コンピューター名)に対して、名前が有効であることを検証します。

戻り値

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

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

戻りコード 説明
DNS_ERROR_INVALID_NAME_CHAR
DNS 名に無効な文字が含まれています。このエラーは、指定された NameType パラメーターが NetSetupDnsMachine であり、lpName パラメーターの DNS 名に無効な文字が含まれている場合に返されます。
DNS_ERROR_NON_RFC_NAME
DNS 名が RFC 仕様に準拠していません。このエラーは、指定された NameType パラメーターが NetSetupDnsMachine であり、lpName パラメーターの DNS 名が RFC 仕様に準拠していない場合に返されます。
ERROR_DUP_NAME
同じ名前がネットワーク上に既に存在します。
ERROR_INVALID_COMPUTERNAME
指定されたコンピューター名の形式が無効です。
ERROR_INVALID_PARAMETER
パラメーターが正しくありません。このエラーは、lpName パラメーターが NULL である場合、または NameType パラメーターが NetSetupUnknown もしくは不明な名前の種類として指定されている場合に返されます。
ERROR_NO_SUCH_DOMAIN
指定されたドメインが存在しません。
ERROR_NOT_SUPPORTED
要求はサポートされていません。このエラーは、lpServer パラメーターでリモートコンピューターが指定され、その呼び出しがリモートコンピューターでサポートされていない場合に返されます。
NERR_InvalidComputer
指定されたコンピューター名が無効です。このエラーは、指定された NameType パラメーターが NetSetupDnsMachine または NetSetupMachine であり、指定されたコンピューター名が無効である場合に返されます。
NERR_InvalidWorkgroupName
指定されたワークグループ名が無効です。このエラーは、指定された NameType パラメーターが NetSetupWorkgroup であり、指定されたワークグループ名が無効である場合に返されます。
RPC_S_SERVER_UNAVAILABLE
RPC サーバーを利用できません。このエラーは、lpServer パラメーターでリモートコンピューターが指定され、RPC サーバーが利用できない場合に返されます。
RPC_E_REMOTE_DISABLED
このプロセスではリモート呼び出しが許可されていません。このエラーは、lpServer パラメーターでリモートコンピューターが指定され、このプロセスでリモート呼び出しが許可されていない場合に返されます。

解説(Remarks)

NetValidateName 関数は、指定された名前の種類に基づいて名前を検証します。

NameType パラメーターが NetSetupMachine の場合、lpName パラメーターに渡された名前は NetBIOS 名として構文的に正しく、かつその名前が現在ネットワーク上で使用されていない必要があります。

NameType パラメーターが NetSetupWorkgroup の場合、lpName パラメーターに渡された名前は NetBIOS 名として構文的に正しく、かつその名前が現在ネットワーク上で一意な名前として使用されておらず、さらにコンピューター名とは異なる名前である必要があります。

NameType パラメーターが NetSetupDomain の場合、lpName パラメーターに渡された名前は NetBIOS 名または DNS 名として構文的に正しく、かつその名前が現在ドメイン名として登録されている必要があります。

NameType パラメーターが NetSetupNonExistentDomain の場合、lpName パラメーターに渡された名前は NetBIOS 名または DNS 名として構文的に正しく、かつその名前が現在ドメイン名として登録されていない必要があります。

NameType パラメーターが NetSetupDnsMachine の場合、lpName パラメーターに渡された名前は DNS 名として構文的に正しい必要があります。

NetBIOS 名は最大長 16 文字に制限されています。

NetValidateName 関数を正常に実行するために、特別なグループメンバーシップは必要ありません。

次の例は、特定の種類に対して名前を検証します。

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

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
#include <lm.h>

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

    NET_API_STATUS nStatus;

    LPCWSTR lpServer = NULL;
    LPCWSTR lpName = NULL;
    LPCWSTR lpAccount = NULL;
    LPCWSTR lpPassword = NULL;
    DWORD dwNameType = NetSetupUnknown; // unknown name type

    if (argc != 3 && argc != 4 && argc != 6) {
        wprintf(L"Usage: %ws Server Name AccountName Password> nametype\n",
                argv[0]);
        wprintf(L"Usage: %ws Server Name nametype\n", argv[0]);
        wprintf(L"Usage: %ws Name nametype\n", argv[0]);
        wprintf(L"     %ws Client2 2\n", argv[0]);
        wprintf(L"     %ws Myserver Client2 3\n", argv[0]);
        wprintf(L"     %ws Myserver Client2 domain\\user password 3\n", argv[0]);
        exit(1);
    }
    // The request is not for the primary domain.
    //
    if (argc == 3) {
        lpName = argv[1];
        dwNameType = _wtoi(argv[2]);
    }

    if (argc == 4) {
        lpServer = argv[1];
        lpName = argv[2];
        dwNameType = _wtoi(argv[3]);
    }

    if (argc == 6) {
        lpServer = argv[1];
        lpName = argv[2];
        lpAccount = argv[3];
        lpPassword = argv[4];
        dwNameType = _wtoi(argv[5]);
    }

    wprintf(L"Calling NetValidateName with parameters\n");
    wprintf(L"    lpServer = %ws\n", lpServer);
    wprintf(L"    lpName = %ws\n", lpName);
    wprintf(L"    lpAccount = %ws\n", lpAccount);
    wprintf(L"    lpPassword = %ws\n", lpPassword);
    wprintf(L"    NameType  = %d ", dwNameType);
    switch (dwNameType) {
    case NetSetupUnknown:
        wprintf(L"(NetSetupUnknown)\n");
        break;
    case NetSetupMachine:
        wprintf(L"(NetSetupMachine)\n");
        break;
    case NetSetupWorkgroup:
        wprintf(L"(NetSetupWorkgroup)\n");
        break;
    case NetSetupDomain:
        wprintf(L"(NetSetupDomain)\n");
        break;
    case NetSetupNonExistentDomain:
        wprintf(L"(NetSetupNonExistentDomain)\n");
        break;
#if(_WIN32_WINNT >= 0x0500)
    case NetSetupDnsMachine:
        wprintf(L"(NetSetupDnsMachine)\n");
        break;
#endif
    default:
        wprintf(L"Other unknown nametype)\n");
        break;
    }

    //
    // Call the NetValidateName function to validate the name
    //
    nStatus = NetValidateName(lpServer,
                              lpName, lpAccount, lpPassword, (NETSETUP_NAME_TYPE) dwNameType);
    //
    // If the call succeeds,
    //
    if ((nStatus == NERR_Success)) {
        wprintf(L"NetValidateName was successful\n", nStatus);
    } else {
        wprintf(L"NetValidateName failed with error: %lu (0x%lx)\n", nStatus,
                nStatus);
        wprintf(L"   Error = ");
        switch (nStatus) {
        case ERROR_INVALID_PARAMETER:
            wprintf(L"ERROR_INVALID_PARAMETER\n");
            break;
        case ERROR_DUP_NAME:
            wprintf(L"ERROR_DUP_NAME\n");
            break;
        case ERROR_NO_SUCH_DOMAIN:
            wprintf(L"ERROR_NO_SUCH_DOMAIN\n");
            break;
        case ERROR_NOT_SUPPORTED:
            wprintf(L"ERROR_NOT_SUPPORTED\n");
            break;
        case ERROR_INVALID_COMPUTERNAME:
            wprintf(L"ERROR_INVALID_COMPUTERNAME\n");
            break;
        case DNS_ERROR_INVALID_NAME_CHAR:
            wprintf(L"DNS_ERROR_INVALID_NAME_CHAR\n");
            break;
        case DNS_ERROR_NON_RFC_NAME:
            wprintf(L"DNS_ERROR_NON_RFC_NAME\n");
            break;
        case NERR_InvalidComputer:
            wprintf(L"NERR_InvalidComputer\n");
            break;
        case NERR_InvalidWorkgroupName:
            wprintf(L"NERR_InvalidWorkgroupName\n");
            break;
        case RPC_S_SERVER_UNAVAILABLE:
            wprintf(L"RPC_S_SERVER_UNAVAILABLE\n");
            break;
        case RPC_E_REMOTE_DISABLED:
            wprintf(L"RPC_E_REMOTE_DISABLED\n");
            break;
        default:
            wprintf(L"Other error, see Winerror.h or lmerr.h)\n");
            break;
        }
    }

    return nStatus;
}

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// NETAPI32.dll
#include <windows.h>

DWORD NetValidateName(
    LPCWSTR lpServer,   // optional
    LPCWSTR lpName,
    LPCWSTR lpAccount,   // optional
    LPCWSTR lpPassword,   // optional
    NETSETUP_NAME_TYPE NameType
);
[DllImport("NETAPI32.dll", ExactSpelling = true)]
static extern uint NetValidateName(
    [MarshalAs(UnmanagedType.LPWStr)] string lpServer,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string lpName,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string lpAccount,   // LPCWSTR optional
    [MarshalAs(UnmanagedType.LPWStr)] string lpPassword,   // LPCWSTR optional
    int NameType   // NETSETUP_NAME_TYPE
);
<DllImport("NETAPI32.dll", ExactSpelling:=True)>
Public Shared Function NetValidateName(
    <MarshalAs(UnmanagedType.LPWStr)> lpServer As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpName As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> lpAccount As String,   ' LPCWSTR optional
    <MarshalAs(UnmanagedType.LPWStr)> lpPassword As String,   ' LPCWSTR optional
    NameType As Integer   ' NETSETUP_NAME_TYPE
) As UInteger
End Function
' lpServer : LPCWSTR optional
' lpName : LPCWSTR
' lpAccount : LPCWSTR optional
' lpPassword : LPCWSTR optional
' NameType : NETSETUP_NAME_TYPE
Declare PtrSafe Function NetValidateName Lib "netapi32" ( _
    ByVal lpServer As LongPtr, _
    ByVal lpName As LongPtr, _
    ByVal lpAccount As LongPtr, _
    ByVal lpPassword As LongPtr, _
    ByVal NameType As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

NetValidateName = ctypes.windll.netapi32.NetValidateName
NetValidateName.restype = wintypes.DWORD
NetValidateName.argtypes = [
    wintypes.LPCWSTR,  # lpServer : LPCWSTR optional
    wintypes.LPCWSTR,  # lpName : LPCWSTR
    wintypes.LPCWSTR,  # lpAccount : LPCWSTR optional
    wintypes.LPCWSTR,  # lpPassword : LPCWSTR optional
    ctypes.c_int,  # NameType : NETSETUP_NAME_TYPE
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('NETAPI32.dll')
NetValidateName = Fiddle::Function.new(
  lib['NetValidateName'],
  [
    Fiddle::TYPE_VOIDP,  # lpServer : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpName : LPCWSTR
    Fiddle::TYPE_VOIDP,  # lpAccount : LPCWSTR optional
    Fiddle::TYPE_VOIDP,  # lpPassword : LPCWSTR optional
    Fiddle::TYPE_INT,  # NameType : NETSETUP_NAME_TYPE
  ],
  -Fiddle::TYPE_INT)
#[link(name = "netapi32")]
extern "system" {
    fn NetValidateName(
        lpServer: *const u16,  // LPCWSTR optional
        lpName: *const u16,  // LPCWSTR
        lpAccount: *const u16,  // LPCWSTR optional
        lpPassword: *const u16,  // LPCWSTR optional
        NameType: i32  // NETSETUP_NAME_TYPE
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("NETAPI32.dll")]
public static extern uint NetValidateName([MarshalAs(UnmanagedType.LPWStr)] string lpServer, [MarshalAs(UnmanagedType.LPWStr)] string lpName, [MarshalAs(UnmanagedType.LPWStr)] string lpAccount, [MarshalAs(UnmanagedType.LPWStr)] string lpPassword, int NameType);
"@
$api = Add-Type -MemberDefinition $sig -Name 'NETAPI32_NetValidateName' -Namespace Win32 -PassThru
# $api::NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
#uselib "NETAPI32.dll"
#func global NetValidateName "NetValidateName" sptr, sptr, sptr, sptr, sptr
; NetValidateName lpServer, lpName, lpAccount, lpPassword, NameType   ; 戻り値は stat
; lpServer : LPCWSTR optional -> "sptr"
; lpName : LPCWSTR -> "sptr"
; lpAccount : LPCWSTR optional -> "sptr"
; lpPassword : LPCWSTR optional -> "sptr"
; NameType : NETSETUP_NAME_TYPE -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "NETAPI32.dll"
#cfunc global NetValidateName "NetValidateName" wstr, wstr, wstr, wstr, int
; res = NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
; lpServer : LPCWSTR optional -> "wstr"
; lpName : LPCWSTR -> "wstr"
; lpAccount : LPCWSTR optional -> "wstr"
; lpPassword : LPCWSTR optional -> "wstr"
; NameType : NETSETUP_NAME_TYPE -> "int"
; DWORD NetValidateName(LPCWSTR lpServer, LPCWSTR lpName, LPCWSTR lpAccount, LPCWSTR lpPassword, NETSETUP_NAME_TYPE NameType)
#uselib "NETAPI32.dll"
#cfunc global NetValidateName "NetValidateName" wstr, wstr, wstr, wstr, int
; res = NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
; lpServer : LPCWSTR optional -> "wstr"
; lpName : LPCWSTR -> "wstr"
; lpAccount : LPCWSTR optional -> "wstr"
; lpPassword : LPCWSTR optional -> "wstr"
; NameType : NETSETUP_NAME_TYPE -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	netapi32 = windows.NewLazySystemDLL("NETAPI32.dll")
	procNetValidateName = netapi32.NewProc("NetValidateName")
)

// lpServer (LPCWSTR optional), lpName (LPCWSTR), lpAccount (LPCWSTR optional), lpPassword (LPCWSTR optional), NameType (NETSETUP_NAME_TYPE)
r1, _, err := procNetValidateName.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpServer))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpName))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpAccount))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpPassword))),
	uintptr(NameType),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function NetValidateName(
  lpServer: PWideChar;   // LPCWSTR optional
  lpName: PWideChar;   // LPCWSTR
  lpAccount: PWideChar;   // LPCWSTR optional
  lpPassword: PWideChar;   // LPCWSTR optional
  NameType: Integer   // NETSETUP_NAME_TYPE
): DWORD; stdcall;
  external 'NETAPI32.dll' name 'NetValidateName';
result := DllCall("NETAPI32\NetValidateName"
    , "WStr", lpServer   ; LPCWSTR optional
    , "WStr", lpName   ; LPCWSTR
    , "WStr", lpAccount   ; LPCWSTR optional
    , "WStr", lpPassword   ; LPCWSTR optional
    , "Int", NameType   ; NETSETUP_NAME_TYPE
    , "UInt")   ; return: DWORD
●NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType) = DLL("NETAPI32.dll", "dword NetValidateName(char*, char*, char*, char*, int)")
# 呼び出し: NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
# lpServer : LPCWSTR optional -> "char*"
# lpName : LPCWSTR -> "char*"
# lpAccount : LPCWSTR optional -> "char*"
# lpPassword : LPCWSTR optional -> "char*"
# NameType : NETSETUP_NAME_TYPE -> "int"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "netapi32" fn NetValidateName(
    lpServer: [*c]const u16, // LPCWSTR optional
    lpName: [*c]const u16, // LPCWSTR
    lpAccount: [*c]const u16, // LPCWSTR optional
    lpPassword: [*c]const u16, // LPCWSTR optional
    NameType: i32 // NETSETUP_NAME_TYPE
) callconv(std.os.windows.WINAPI) u32;
proc NetValidateName(
    lpServer: WideCString,  # LPCWSTR optional
    lpName: WideCString,  # LPCWSTR
    lpAccount: WideCString,  # LPCWSTR optional
    lpPassword: WideCString,  # LPCWSTR optional
    NameType: int32  # NETSETUP_NAME_TYPE
): uint32 {.importc: "NetValidateName", stdcall, dynlib: "NETAPI32.dll".}
pragma(lib, "netapi32");
extern(Windows)
uint NetValidateName(
    const(wchar)* lpServer,   // LPCWSTR optional
    const(wchar)* lpName,   // LPCWSTR
    const(wchar)* lpAccount,   // LPCWSTR optional
    const(wchar)* lpPassword,   // LPCWSTR optional
    int NameType   // NETSETUP_NAME_TYPE
);
ccall((:NetValidateName, "NETAPI32.dll"), stdcall, UInt32,
      (Cwstring, Cwstring, Cwstring, Cwstring, Int32),
      lpServer, lpName, lpAccount, lpPassword, NameType)
# lpServer : LPCWSTR optional -> Cwstring
# lpName : LPCWSTR -> Cwstring
# lpAccount : LPCWSTR optional -> Cwstring
# lpPassword : LPCWSTR optional -> Cwstring
# NameType : NETSETUP_NAME_TYPE -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t NetValidateName(
    const uint16_t* lpServer,
    const uint16_t* lpName,
    const uint16_t* lpAccount,
    const uint16_t* lpPassword,
    int32_t NameType);
]]
local netapi32 = ffi.load("netapi32")
-- netapi32.NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
-- lpServer : LPCWSTR optional
-- lpName : LPCWSTR
-- lpAccount : LPCWSTR optional
-- lpPassword : LPCWSTR optional
-- NameType : NETSETUP_NAME_TYPE
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('NETAPI32.dll');
const NetValidateName = lib.func('__stdcall', 'NetValidateName', 'uint32_t', ['str16', 'str16', 'str16', 'str16', 'int32_t']);
// NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
// lpServer : LPCWSTR optional -> 'str16'
// lpName : LPCWSTR -> 'str16'
// lpAccount : LPCWSTR optional -> 'str16'
// lpPassword : LPCWSTR optional -> 'str16'
// NameType : NETSETUP_NAME_TYPE -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("NETAPI32.dll", {
  NetValidateName: { parameters: ["buffer", "buffer", "buffer", "buffer", "i32"], result: "u32" },
});
// lib.symbols.NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType)
// lpServer : LPCWSTR optional -> "buffer"
// lpName : LPCWSTR -> "buffer"
// lpAccount : LPCWSTR optional -> "buffer"
// lpPassword : LPCWSTR optional -> "buffer"
// NameType : NETSETUP_NAME_TYPE -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t NetValidateName(
    const uint16_t* lpServer,
    const uint16_t* lpName,
    const uint16_t* lpAccount,
    const uint16_t* lpPassword,
    int32_t NameType);
C, "NETAPI32.dll");
// $ffi->NetValidateName(lpServer, lpName, lpAccount, lpPassword, NameType);
// lpServer : LPCWSTR optional
// lpName : LPCWSTR
// lpAccount : LPCWSTR optional
// lpPassword : LPCWSTR optional
// NameType : NETSETUP_NAME_TYPE
// 構造体/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 Netapi32 extends StdCallLibrary {
    Netapi32 INSTANCE = Native.load("netapi32", Netapi32.class);
    int NetValidateName(
        WString lpServer,   // LPCWSTR optional
        WString lpName,   // LPCWSTR
        WString lpAccount,   // LPCWSTR optional
        WString lpPassword,   // LPCWSTR optional
        int NameType   // NETSETUP_NAME_TYPE
    );
}
@[Link("netapi32")]
lib LibNETAPI32
  fun NetValidateName = NetValidateName(
    lpServer : UInt16*,   # LPCWSTR optional
    lpName : UInt16*,   # LPCWSTR
    lpAccount : UInt16*,   # LPCWSTR optional
    lpPassword : UInt16*,   # LPCWSTR optional
    NameType : Int32   # NETSETUP_NAME_TYPE
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef NetValidateNameNative = Uint32 Function(Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Int32);
typedef NetValidateNameDart = int Function(Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Utf16>, int);
final NetValidateName = DynamicLibrary.open('NETAPI32.dll')
    .lookupFunction<NetValidateNameNative, NetValidateNameDart>('NetValidateName');
// lpServer : LPCWSTR optional -> Pointer<Utf16>
// lpName : LPCWSTR -> Pointer<Utf16>
// lpAccount : LPCWSTR optional -> Pointer<Utf16>
// lpPassword : LPCWSTR optional -> Pointer<Utf16>
// NameType : NETSETUP_NAME_TYPE -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function NetValidateName(
  lpServer: PWideChar;   // LPCWSTR optional
  lpName: PWideChar;   // LPCWSTR
  lpAccount: PWideChar;   // LPCWSTR optional
  lpPassword: PWideChar;   // LPCWSTR optional
  NameType: Integer   // NETSETUP_NAME_TYPE
): DWORD; stdcall;
  external 'NETAPI32.dll' name 'NetValidateName';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "NetValidateName"
  c_NetValidateName :: CWString -> CWString -> CWString -> CWString -> Int32 -> IO Word32
-- lpServer : LPCWSTR optional -> CWString
-- lpName : LPCWSTR -> CWString
-- lpAccount : LPCWSTR optional -> CWString
-- lpPassword : LPCWSTR optional -> CWString
-- NameType : NETSETUP_NAME_TYPE -> Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let netvalidatename =
  foreign "NetValidateName"
    ((ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> int32_t @-> returning uint32_t)
(* lpServer : LPCWSTR optional -> (ptr uint16_t) *)
(* lpName : LPCWSTR -> (ptr uint16_t) *)
(* lpAccount : LPCWSTR optional -> (ptr uint16_t) *)
(* lpPassword : LPCWSTR optional -> (ptr uint16_t) *)
(* NameType : NETSETUP_NAME_TYPE -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library netapi32 (t "NETAPI32.dll"))
(cffi:use-foreign-library netapi32)

(cffi:defcfun ("NetValidateName" net-validate-name :convention :stdcall) :uint32
  (lp-server (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lp-name (:string :encoding :utf-16le))   ; LPCWSTR
  (lp-account (:string :encoding :utf-16le))   ; LPCWSTR optional
  (lp-password (:string :encoding :utf-16le))   ; LPCWSTR optional
  (name-type :int32))   ; NETSETUP_NAME_TYPE
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $NetValidateName = Win32::API::More->new('NETAPI32',
    'DWORD NetValidateName(LPCWSTR lpServer, LPCWSTR lpName, LPCWSTR lpAccount, LPCWSTR lpPassword, int NameType)');
# my $ret = $NetValidateName->Call($lpServer, $lpName, $lpAccount, $lpPassword, $NameType);
# lpServer : LPCWSTR optional -> LPCWSTR
# lpName : LPCWSTR -> LPCWSTR
# lpAccount : LPCWSTR optional -> LPCWSTR
# lpPassword : LPCWSTR optional -> LPCWSTR
# NameType : NETSETUP_NAME_TYPE -> int
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型