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

DeleteIPAddress

関数
AddIPAddressで追加したIPv4アドレスを削除する。
DLLIPHLPAPI.dll呼出規約winapi対応OSWindows 2000 以降

シグネチャ

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

DWORD DeleteIPAddress(
    DWORD NTEContext
);

パラメーター

名前方向説明
NTEContextDWORDinIP アドレスの Net Table Entry (NTE) コンテキストです。このコンテキストは、以前の AddIPAddress の呼び出しによって返されたものです。

戻り値の型: DWORD

公式ドキュメント

DeleteIPAddress 関数は、AddIPAddress を使用して以前に追加した IP アドレスを削除します。

戻り値

関数が成功した場合、NO_ERROR (ゼロ) を返します。

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

戻り値 説明
ERROR_ACCESS_DENIED
アクセスが拒否されました。このエラーは、Windows Vista および Windows Server 2008 において、次のような複数の状況で返されます。すなわち、ユーザーがローカルコンピューター上で必要な管理者特権を持っていない場合、またはアプリケーションが組み込みの Administrator (RunAs administrator) として昇格されたシェルで実行されていない場合です。
ERROR_INVALID_PARAMETER
入力パラメーターが無効です。何も処理は行われませんでした。
ERROR_NOT_SUPPORTED
ローカルコンピューターで IPv4 トランスポートが構成されていません。
その他
返されたエラーのメッセージ文字列を取得するには、 FormatMessage を使用してください。

解説(Remarks)

Windows Vista 以降では、DeleteIPAddress 関数は Administrators グループのメンバーとしてログオンしているユーザーのみが呼び出すことができます。DeleteIPAddress が Administrators グループのメンバーでないユーザーによって呼び出された場合、関数の呼び出しは失敗し、ERROR_ACCESS_DENIED が返されます。この関数は、Windows Vista 以降のユーザーアカウント制御 (UAC) が原因で失敗することもあります。この関数を含むアプリケーションが、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしているユーザーによって実行された場合、アプリケーションのマニフェストファイルで requestedExecutionLevel が requireAdministrator に設定されていない限り、この呼び出しは失敗します。Windows Vista 以降でアプリケーションにこのマニフェストファイルがない場合、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしているユーザーは、この関数を成功させるために、組み込みの Administrator (RunAs administrator) として昇格されたシェルでアプリケーションを実行する必要があります。

注意 Windows NT 4.0 および Windows 2000 以降では、この関数は特権操作を実行します。この関数を正常に実行するには、呼び出し元が Administrators グループまたは NetworkConfigurationOperators グループのメンバーとしてログオンしている必要があります。

次の例では、IP アドレステーブルを取得し、最初のアダプターに IP アドレス 192.168.0.27 を追加します。その後、追加した IP アドレスを削除します。

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

int main()
{
    // Declare and initialize variables
    PMIB_IPADDRTABLE pIPAddrTable;
    DWORD dwSize = 0;
    DWORD dwRetVal;

    // IP and mask we will be adding
    UINT iaIPAddress;
    UINT imIPMask;

    // Variables where handles to the added IP will be returned
    ULONG NTEContext = 0;
    ULONG NTEInstance = 0;

    LPVOID lpMsgBuf;


    // Before calling AddIPAddress we use GetIpAddrTable to get
    // an adapter to which we can add the IP.
    pIPAddrTable = (MIB_IPADDRTABLE *) malloc(sizeof (MIB_IPADDRTABLE));

    // Make an initial call to GetIpAddrTable to get the
    // necessary size into the dwSize variable
    if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
        GlobalFree(pIPAddrTable);
        pIPAddrTable = (MIB_IPADDRTABLE *) malloc(dwSize);
    }
    // Make a second call to GetIpAddrTable to get the
    // actual data we want
    if ((dwRetVal = GetIpAddrTable(pIPAddrTable, &dwSize, 0)) == NO_ERROR) {
        printf("\tAddress: %ld\n", pIPAddrTable->table[0].dwAddr);
        printf("\tMask:    %ld\n", pIPAddrTable->table[0].dwMask);
        printf("\tIndex:   %ld\n", pIPAddrTable->table[0].dwIndex);
        printf("\tBCast:   %ld\n", pIPAddrTable->table[0].dwBCastAddr);
        printf("\tReasm:   %ld\n", pIPAddrTable->table[0].dwReasmSize);
    } else {
        printf("Call to GetIpAddrTable failed.\n");
    }

    // IP and mask we will be adding

    iaIPAddress = inet_addr("192.168.0.27");
    imIPMask = inet_addr("255.255.255.0");

    if ((dwRetVal = AddIPAddress(iaIPAddress,
                                 imIPMask,
                                 pIPAddrTable->table[0].dwIndex,
                                 &NTEContext, &NTEInstance)) == NO_ERROR) {
        printf("\tIP address added.\n");
    }

    else {
        printf("Error adding IP address.\n");

        if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
                          (LPTSTR) & lpMsgBuf, 0, NULL)) {
            printf("\tError: %s", lpMsgBuf);
        }
        LocalFree(lpMsgBuf);
    }

    // Delete the IP we just added using the NTEContext
    // variable where the handle was returned       
    if ((dwRetVal = DeleteIPAddress(NTEContext)) == NO_ERROR) {
        printf("\tIP Address Deleted.\n");
    } else {
        printf("\tCall to DeleteIPAddress failed.\n");
    }

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

各言語での呼び出し定義

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

DWORD DeleteIPAddress(
    DWORD NTEContext
);
[DllImport("IPHLPAPI.dll", ExactSpelling = true)]
static extern uint DeleteIPAddress(
    uint NTEContext   // DWORD
);
<DllImport("IPHLPAPI.dll", ExactSpelling:=True)>
Public Shared Function DeleteIPAddress(
    NTEContext As UInteger   ' DWORD
) As UInteger
End Function
' NTEContext : DWORD
Declare PtrSafe Function DeleteIPAddress Lib "iphlpapi" ( _
    ByVal NTEContext As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

DeleteIPAddress = ctypes.windll.iphlpapi.DeleteIPAddress
DeleteIPAddress.restype = wintypes.DWORD
DeleteIPAddress.argtypes = [
    wintypes.DWORD,  # NTEContext : DWORD
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('IPHLPAPI.dll')
DeleteIPAddress = Fiddle::Function.new(
  lib['DeleteIPAddress'],
  [
    -Fiddle::TYPE_INT,  # NTEContext : DWORD
  ],
  -Fiddle::TYPE_INT)
#[link(name = "iphlpapi")]
extern "system" {
    fn DeleteIPAddress(
        NTEContext: u32  // DWORD
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("IPHLPAPI.dll")]
public static extern uint DeleteIPAddress(uint NTEContext);
"@
$api = Add-Type -MemberDefinition $sig -Name 'IPHLPAPI_DeleteIPAddress' -Namespace Win32 -PassThru
# $api::DeleteIPAddress(NTEContext)
#uselib "IPHLPAPI.dll"
#func global DeleteIPAddress "DeleteIPAddress" sptr
; DeleteIPAddress NTEContext   ; 戻り値は stat
; NTEContext : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "IPHLPAPI.dll"
#cfunc global DeleteIPAddress "DeleteIPAddress" int
; res = DeleteIPAddress(NTEContext)
; NTEContext : DWORD -> "int"
; DWORD DeleteIPAddress(DWORD NTEContext)
#uselib "IPHLPAPI.dll"
#cfunc global DeleteIPAddress "DeleteIPAddress" int
; res = DeleteIPAddress(NTEContext)
; NTEContext : DWORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	iphlpapi = windows.NewLazySystemDLL("IPHLPAPI.dll")
	procDeleteIPAddress = iphlpapi.NewProc("DeleteIPAddress")
)

// NTEContext (DWORD)
r1, _, err := procDeleteIPAddress.Call(
	uintptr(NTEContext),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function DeleteIPAddress(
  NTEContext: DWORD   // DWORD
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'DeleteIPAddress';
result := DllCall("IPHLPAPI\DeleteIPAddress"
    , "UInt", NTEContext   ; DWORD
    , "UInt")   ; return: DWORD
●DeleteIPAddress(NTEContext) = DLL("IPHLPAPI.dll", "dword DeleteIPAddress(dword)")
# 呼び出し: DeleteIPAddress(NTEContext)
# NTEContext : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef DeleteIPAddressNative = Uint32 Function(Uint32);
typedef DeleteIPAddressDart = int Function(int);
final DeleteIPAddress = DynamicLibrary.open('IPHLPAPI.dll')
    .lookupFunction<DeleteIPAddressNative, DeleteIPAddressDart>('DeleteIPAddress');
// NTEContext : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function DeleteIPAddress(
  NTEContext: DWORD   // DWORD
): DWORD; stdcall;
  external 'IPHLPAPI.dll' name 'DeleteIPAddress';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "DeleteIPAddress"
  c_DeleteIPAddress :: Word32 -> IO Word32
-- NTEContext : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let deleteipaddress =
  foreign "DeleteIPAddress"
    (uint32_t @-> returning uint32_t)
(* NTEContext : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library iphlpapi (t "IPHLPAPI.dll"))
(cffi:use-foreign-library iphlpapi)

(cffi:defcfun ("DeleteIPAddress" delete-ipaddress :convention :stdcall) :uint32
  (ntecontext :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $DeleteIPAddress = Win32::API::More->new('IPHLPAPI',
    'DWORD DeleteIPAddress(DWORD NTEContext)');
# my $ret = $DeleteIPAddress->Call($NTEContext);
# NTEContext : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目