Win32 API 日本語リファレンス
ホームNetworking.WinSock › WSCDeinstallProvider32

WSCDeinstallProvider32

関数
32ビットカタログからトランスポートプロバイダを削除する。
DLLWS2_32.dll呼出規約winapi対応OSWindows Vista 以降

シグネチャ

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

INT WSCDeinstallProvider32(
    GUID* lpProviderId,
    INT* lpErrno
);

パラメーター

名前方向説明
lpProviderIdGUID*inプロバイダーのグローバル一意識別子 (GUID) へのポインター。この値は各 WSAProtocol_Info 構造体内に格納されています。
lpErrnoINT*out関数が失敗した場合のエラーコードへのポインター。

戻り値の型: INT

公式ドキュメント

指定された 32 ビットトランスポートプロバイダーをシステム構成データベースから削除します。

戻り値

エラーが発生しなかった場合、 WSCDeinstallProvider32 は 0 を返します。それ以外の場合は SOCKET_ERROR を返し、具体的なエラーコードが lpErrno から取得できます。

エラーコード 意味
WSAEINVAL
lpProviderId パラメーターが有効なプロバイダーを指定していません。
WSAEFAULT
lpErrno パラメーターがユーザーアドレス空間の有効な部分にありません。
WSANO_RECOVERY
回復不能なエラーが発生しました。このエラーは、ユーザーが Windows Sockets レジストリへの書き込みに必要な管理者権限を持っていない、またはカタログエントリのオープン時に障害が発生したなど、いくつかの条件下で返されます。
WSA_NOT_ENOUGH_MEMORY
利用可能なメモリが不足していました。このエラーは、新しいカタログエントリを割り当てるのに十分なメモリがない場合に返されます。

解説(Remarks)

WSCDeinstallProvider32WSCDeinstallProvider の厳密に 32 ビット専用のバージョンです。64 ビットコンピューターでは、特に 32 ビット用ではないすべての呼び出し (たとえば、末尾が "32" で終わらないすべての関数) はネイティブの 64 ビットカタログを操作します。64 ビットコンピューター上で実行されるプロセスは、厳密に 32 ビットのカタログを操作して互換性を維持するために、専用の 32 ビット関数呼び出しを使用する必要があります。専用の 32 ビット呼び出しの定義とセマンティクスは、対応するネイティブ版と同じです。

WSCDeinstallProvider32 関数は、指定された 32 ビットプロバイダーの共通の Windows Sockets 2 構成情報を削除します。このルーチンが正常に完了すると、レジストリに格納された構成情報が変更されます。ただし、現在メモリ内にある Ws2_32.dll の各インスタンスはこの変更を認識できません。

成功すると、WSCDeinstallProvider32WSAProviderConfigChange を呼び出して、変更の通知を登録しているすべての関係アプリケーションに通知しようとします。

WSCDeinstallProvider32 関数は、Administrators グループのメンバーとしてログオンしているユーザーのみが呼び出すことができます。WSCDeinstallProvider32 が Administrators グループのメンバーではないユーザーによって呼び出された場合、関数呼び出しは失敗し、lpErrno パラメーターに WSANO_RECOVERY が返されます。

Windows Vista または Windows Server 2008 を実行しているコンピューターでは、この関数はユーザーアカウント制御 (UAC) が原因で失敗することもあります。この関数を含むアプリケーションが、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしたユーザーによって実行された場合、マニフェストファイルで requestedExecutionLevelrequireAdministrator に設定されていない限り、この呼び出しは失敗します。Windows Vista または Windows Server 2008 上のアプリケーションにこのマニフェストファイルがない場合、組み込みの Administrator 以外の Administrators グループのメンバーとしてログオンしたユーザーは、この関数を成功させるために、組み込みの Administrator として拡張シェル内 (管理者として実行) でアプリケーションを実行する必要があります。

この関数の呼び出し元は、サービスプロバイダーを完全にアンインストールするために必要な追加ファイルやサービスプロバイダー固有の構成情報を削除する必要があります。

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

各言語での呼び出し定義

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

INT WSCDeinstallProvider32(
    GUID* lpProviderId,
    INT* lpErrno
);
[DllImport("WS2_32.dll", ExactSpelling = true)]
static extern int WSCDeinstallProvider32(
    ref Guid lpProviderId,   // GUID*
    out int lpErrno   // INT* out
);
<DllImport("WS2_32.dll", ExactSpelling:=True)>
Public Shared Function WSCDeinstallProvider32(
    ByRef lpProviderId As Guid,   ' GUID*
    <Out> ByRef lpErrno As Integer   ' INT* out
) As Integer
End Function
' lpProviderId : GUID*
' lpErrno : INT* out
Declare PtrSafe Function WSCDeinstallProvider32 Lib "ws2_32" ( _
    ByVal lpProviderId As LongPtr, _
    ByRef lpErrno As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

WSCDeinstallProvider32 = ctypes.windll.ws2_32.WSCDeinstallProvider32
WSCDeinstallProvider32.restype = ctypes.c_int
WSCDeinstallProvider32.argtypes = [
    ctypes.c_void_p,  # lpProviderId : GUID*
    ctypes.POINTER(ctypes.c_int),  # lpErrno : INT* out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WS2_32.dll')
WSCDeinstallProvider32 = Fiddle::Function.new(
  lib['WSCDeinstallProvider32'],
  [
    Fiddle::TYPE_VOIDP,  # lpProviderId : GUID*
    Fiddle::TYPE_VOIDP,  # lpErrno : INT* out
  ],
  Fiddle::TYPE_INT)
#[link(name = "ws2_32")]
extern "system" {
    fn WSCDeinstallProvider32(
        lpProviderId: *mut GUID,  // GUID*
        lpErrno: *mut i32  // INT* out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WS2_32.dll")]
public static extern int WSCDeinstallProvider32(ref Guid lpProviderId, out int lpErrno);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_WSCDeinstallProvider32' -Namespace Win32 -PassThru
# $api::WSCDeinstallProvider32(lpProviderId, lpErrno)
#uselib "WS2_32.dll"
#func global WSCDeinstallProvider32 "WSCDeinstallProvider32" sptr, sptr
; WSCDeinstallProvider32 varptr(lpProviderId), varptr(lpErrno)   ; 戻り値は stat
; lpProviderId : GUID* -> "sptr"
; lpErrno : INT* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WS2_32.dll"
#cfunc global WSCDeinstallProvider32 "WSCDeinstallProvider32" var, var
; res = WSCDeinstallProvider32(lpProviderId, lpErrno)
; lpProviderId : GUID* -> "var"
; lpErrno : INT* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT WSCDeinstallProvider32(GUID* lpProviderId, INT* lpErrno)
#uselib "WS2_32.dll"
#cfunc global WSCDeinstallProvider32 "WSCDeinstallProvider32" var, var
; res = WSCDeinstallProvider32(lpProviderId, lpErrno)
; lpProviderId : GUID* -> "var"
; lpErrno : INT* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procWSCDeinstallProvider32 = ws2_32.NewProc("WSCDeinstallProvider32")
)

// lpProviderId (GUID*), lpErrno (INT* out)
r1, _, err := procWSCDeinstallProvider32.Call(
	uintptr(lpProviderId),
	uintptr(lpErrno),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // INT
function WSCDeinstallProvider32(
  lpProviderId: PGUID;   // GUID*
  lpErrno: Pointer   // INT* out
): Integer; stdcall;
  external 'WS2_32.dll' name 'WSCDeinstallProvider32';
result := DllCall("WS2_32\WSCDeinstallProvider32"
    , "Ptr", lpProviderId   ; GUID*
    , "Ptr", lpErrno   ; INT* out
    , "Int")   ; return: INT
●WSCDeinstallProvider32(lpProviderId, lpErrno) = DLL("WS2_32.dll", "int WSCDeinstallProvider32(void*, void*)")
# 呼び出し: WSCDeinstallProvider32(lpProviderId, lpErrno)
# lpProviderId : GUID* -> "void*"
# lpErrno : INT* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef WSCDeinstallProvider32Native = Int32 Function(Pointer<Void>, Pointer<Int32>);
typedef WSCDeinstallProvider32Dart = int Function(Pointer<Void>, Pointer<Int32>);
final WSCDeinstallProvider32 = DynamicLibrary.open('WS2_32.dll')
    .lookupFunction<WSCDeinstallProvider32Native, WSCDeinstallProvider32Dart>('WSCDeinstallProvider32');
// lpProviderId : GUID* -> Pointer<Void>
// lpErrno : INT* out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WSCDeinstallProvider32(
  lpProviderId: PGUID;   // GUID*
  lpErrno: Pointer   // INT* out
): Integer; stdcall;
  external 'WS2_32.dll' name 'WSCDeinstallProvider32';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "WSCDeinstallProvider32"
  c_WSCDeinstallProvider32 :: Ptr () -> Ptr Int32 -> IO Int32
-- lpProviderId : GUID* -> Ptr ()
-- lpErrno : INT* out -> Ptr Int32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let wscdeinstallprovider32 =
  foreign "WSCDeinstallProvider32"
    ((ptr void) @-> (ptr int32_t) @-> returning int32_t)
(* lpProviderId : GUID* -> (ptr void) *)
(* lpErrno : INT* out -> (ptr int32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library ws2_32 (t "WS2_32.dll"))
(cffi:use-foreign-library ws2_32)

(cffi:defcfun ("WSCDeinstallProvider32" wscdeinstall-provider32 :convention :stdcall) :int32
  (lp-provider-id :pointer)   ; GUID*
  (lp-errno :pointer))   ; INT* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WSCDeinstallProvider32 = Win32::API::More->new('WS2_32',
    'int WSCDeinstallProvider32(LPVOID lpProviderId, LPVOID lpErrno)');
# my $ret = $WSCDeinstallProvider32->Call($lpProviderId, $lpErrno);
# lpProviderId : GUID* -> LPVOID
# lpErrno : INT* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
公式の関連項目