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

WSCGetProviderPath32

関数
32ビットカタログのプロバイダDLLパスを取得する。
DLLWS2_32.dll呼出規約winapi対応OSWindows Vista 以降

シグネチャ

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

INT WSCGetProviderPath32(
    GUID* lpProviderId,
    LPWSTR lpszProviderDllPath,
    INT* lpProviderDllPathLen,
    INT* lpErrno
);

パラメーター

名前方向説明
lpProviderIdGUID*inプロバイダーのローカルで一意の識別子。この値は WSCEnumProtocols32 を使用して取得します。
lpszProviderDllPathLPWSTRoutプロバイダー DLL のパス文字列が返されるバッファーへのポインター。パスは null で終わる文字列であり、%SystemRoot% などの埋め込み環境文字列は展開されていません。
lpProviderDllPathLenINT*inoutlpszProviderDllPath パラメーターが指すバッファーのサイズ(文字単位)。
lpErrnoINT*outエラーコードへのポインター。

戻り値の型: INT

公式ドキュメント

指定された 32 ビットプロバイダーの DLL パスを取得します。Note この呼び出しは、64 ビットプラットフォームで使用する WSCGetProviderPath の厳密な 32 ビット版です。64 ビットプロセスが 32 ビットカタログにアクセスできるようにするために提供されています。

戻り値

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

エラーコード 意味
WSAEINVAL
lpProviderId パラメーターが有効なプロバイダーを指定していません。
WSAEFAULT
lpszProviderDllPath または lpErrno パラメーターがユーザーアドレス空間の有効な部分にないか、lpProviderDllPathLen が小さすぎます。

解説(Remarks)

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

WSCGetProviderPath32 関数は、指定されたプロバイダーの DLL パスを取得します。DLL パスには %SystemRoot% などの埋め込み環境文字列が含まれている場合があるため、Windows の LoadLibrary 関数で使用する前に展開する必要があります。詳細については、LoadLibrary を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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 WSCGetProviderPath32(
    GUID* lpProviderId,
    LPWSTR lpszProviderDllPath,
    INT* lpProviderDllPathLen,
    INT* lpErrno
);
[DllImport("WS2_32.dll", ExactSpelling = true)]
static extern int WSCGetProviderPath32(
    ref Guid lpProviderId,   // GUID*
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpszProviderDllPath,   // LPWSTR out
    ref int lpProviderDllPathLen,   // INT* in/out
    out int lpErrno   // INT* out
);
<DllImport("WS2_32.dll", ExactSpelling:=True)>
Public Shared Function WSCGetProviderPath32(
    ByRef lpProviderId As Guid,   ' GUID*
    <MarshalAs(UnmanagedType.LPWStr)> lpszProviderDllPath As System.Text.StringBuilder,   ' LPWSTR out
    ByRef lpProviderDllPathLen As Integer,   ' INT* in/out
    <Out> ByRef lpErrno As Integer   ' INT* out
) As Integer
End Function
' lpProviderId : GUID*
' lpszProviderDllPath : LPWSTR out
' lpProviderDllPathLen : INT* in/out
' lpErrno : INT* out
Declare PtrSafe Function WSCGetProviderPath32 Lib "ws2_32" ( _
    ByVal lpProviderId As LongPtr, _
    ByVal lpszProviderDllPath As LongPtr, _
    ByRef lpProviderDllPathLen As Long, _
    ByRef lpErrno As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

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

lib = Fiddle.dlopen('WS2_32.dll')
WSCGetProviderPath32 = Fiddle::Function.new(
  lib['WSCGetProviderPath32'],
  [
    Fiddle::TYPE_VOIDP,  # lpProviderId : GUID*
    Fiddle::TYPE_VOIDP,  # lpszProviderDllPath : LPWSTR out
    Fiddle::TYPE_VOIDP,  # lpProviderDllPathLen : INT* in/out
    Fiddle::TYPE_VOIDP,  # lpErrno : INT* out
  ],
  Fiddle::TYPE_INT)
#[link(name = "ws2_32")]
extern "system" {
    fn WSCGetProviderPath32(
        lpProviderId: *mut GUID,  // GUID*
        lpszProviderDllPath: *mut u16,  // LPWSTR out
        lpProviderDllPathLen: *mut i32,  // INT* in/out
        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 WSCGetProviderPath32(ref Guid lpProviderId, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpszProviderDllPath, ref int lpProviderDllPathLen, out int lpErrno);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_WSCGetProviderPath32' -Namespace Win32 -PassThru
# $api::WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
#uselib "WS2_32.dll"
#func global WSCGetProviderPath32 "WSCGetProviderPath32" sptr, sptr, sptr, sptr
; WSCGetProviderPath32 varptr(lpProviderId), varptr(lpszProviderDllPath), varptr(lpProviderDllPathLen), varptr(lpErrno)   ; 戻り値は stat
; lpProviderId : GUID* -> "sptr"
; lpszProviderDllPath : LPWSTR out -> "sptr"
; lpProviderDllPathLen : INT* in/out -> "sptr"
; lpErrno : INT* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WS2_32.dll"
#cfunc global WSCGetProviderPath32 "WSCGetProviderPath32" var, var, var, var
; res = WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
; lpProviderId : GUID* -> "var"
; lpszProviderDllPath : LPWSTR out -> "var"
; lpProviderDllPathLen : INT* in/out -> "var"
; lpErrno : INT* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; INT WSCGetProviderPath32(GUID* lpProviderId, LPWSTR lpszProviderDllPath, INT* lpProviderDllPathLen, INT* lpErrno)
#uselib "WS2_32.dll"
#cfunc global WSCGetProviderPath32 "WSCGetProviderPath32" var, var, var, var
; res = WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
; lpProviderId : GUID* -> "var"
; lpszProviderDllPath : LPWSTR out -> "var"
; lpProviderDllPathLen : INT* in/out -> "var"
; lpErrno : INT* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procWSCGetProviderPath32 = ws2_32.NewProc("WSCGetProviderPath32")
)

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

extern "ws2_32" fn WSCGetProviderPath32(
    lpProviderId: [*c]GUID, // GUID*
    lpszProviderDllPath: [*c]u16, // LPWSTR out
    lpProviderDllPathLen: [*c]i32, // INT* in/out
    lpErrno: [*c]i32 // INT* out
) callconv(std.os.windows.WINAPI) i32;
proc WSCGetProviderPath32(
    lpProviderId: ptr GUID,  # GUID*
    lpszProviderDllPath: ptr uint16,  # LPWSTR out
    lpProviderDllPathLen: ptr int32,  # INT* in/out
    lpErrno: ptr int32  # INT* out
): int32 {.importc: "WSCGetProviderPath32", stdcall, dynlib: "WS2_32.dll".}
pragma(lib, "ws2_32");
extern(Windows)
int WSCGetProviderPath32(
    GUID* lpProviderId,   // GUID*
    wchar* lpszProviderDllPath,   // LPWSTR out
    int* lpProviderDllPathLen,   // INT* in/out
    int* lpErrno   // INT* out
);
ccall((:WSCGetProviderPath32, "WS2_32.dll"), stdcall, Int32,
      (Ptr{GUID}, Ptr{UInt16}, Ptr{Int32}, Ptr{Int32}),
      lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
# lpProviderId : GUID* -> Ptr{GUID}
# lpszProviderDllPath : LPWSTR out -> Ptr{UInt16}
# lpProviderDllPathLen : INT* in/out -> Ptr{Int32}
# lpErrno : INT* out -> Ptr{Int32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t WSCGetProviderPath32(
    void* lpProviderId,
    uint16_t* lpszProviderDllPath,
    int32_t* lpProviderDllPathLen,
    int32_t* lpErrno);
]]
local ws2_32 = ffi.load("ws2_32")
-- ws2_32.WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
-- lpProviderId : GUID*
-- lpszProviderDllPath : LPWSTR out
-- lpProviderDllPathLen : INT* in/out
-- lpErrno : INT* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('WS2_32.dll');
const WSCGetProviderPath32 = lib.func('__stdcall', 'WSCGetProviderPath32', 'int32_t', ['void *', 'uint16_t *', 'int32_t *', 'int32_t *']);
// WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
// lpProviderId : GUID* -> 'void *'
// lpszProviderDllPath : LPWSTR out -> 'uint16_t *'
// lpProviderDllPathLen : INT* in/out -> 'int32_t *'
// lpErrno : INT* out -> 'int32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("WS2_32.dll", {
  WSCGetProviderPath32: { parameters: ["pointer", "buffer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno)
// lpProviderId : GUID* -> "pointer"
// lpszProviderDllPath : LPWSTR out -> "buffer"
// lpProviderDllPathLen : INT* in/out -> "pointer"
// lpErrno : INT* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t WSCGetProviderPath32(
    void* lpProviderId,
    uint16_t* lpszProviderDllPath,
    int32_t* lpProviderDllPathLen,
    int32_t* lpErrno);
C, "WS2_32.dll");
// $ffi->WSCGetProviderPath32(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno);
// lpProviderId : GUID*
// lpszProviderDllPath : LPWSTR out
// lpProviderDllPathLen : INT* in/out
// 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 WSCGetProviderPath32(
        Pointer lpProviderId,   // GUID*
        char[] lpszProviderDllPath,   // LPWSTR out
        IntByReference lpProviderDllPathLen,   // INT* in/out
        IntByReference lpErrno   // INT* out
    );
}
@[Link("ws2_32")]
lib LibWS2_32
  fun WSCGetProviderPath32 = WSCGetProviderPath32(
    lpProviderId : GUID*,   # GUID*
    lpszProviderDllPath : UInt16*,   # LPWSTR out
    lpProviderDllPathLen : Int32*,   # INT* in/out
    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 WSCGetProviderPath32Native = Int32 Function(Pointer<Void>, Pointer<Utf16>, Pointer<Int32>, Pointer<Int32>);
typedef WSCGetProviderPath32Dart = int Function(Pointer<Void>, Pointer<Utf16>, Pointer<Int32>, Pointer<Int32>);
final WSCGetProviderPath32 = DynamicLibrary.open('WS2_32.dll')
    .lookupFunction<WSCGetProviderPath32Native, WSCGetProviderPath32Dart>('WSCGetProviderPath32');
// lpProviderId : GUID* -> Pointer<Void>
// lpszProviderDllPath : LPWSTR out -> Pointer<Utf16>
// lpProviderDllPathLen : INT* in/out -> Pointer<Int32>
// lpErrno : INT* out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function WSCGetProviderPath32(
  lpProviderId: PGUID;   // GUID*
  lpszProviderDllPath: PWideChar;   // LPWSTR out
  lpProviderDllPathLen: Pointer;   // INT* in/out
  lpErrno: Pointer   // INT* out
): Integer; stdcall;
  external 'WS2_32.dll' name 'WSCGetProviderPath32';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let wscgetproviderpath32 =
  foreign "WSCGetProviderPath32"
    ((ptr void) @-> (ptr uint16_t) @-> (ptr int32_t) @-> (ptr int32_t) @-> returning int32_t)
(* lpProviderId : GUID* -> (ptr void) *)
(* lpszProviderDllPath : LPWSTR out -> (ptr uint16_t) *)
(* lpProviderDllPathLen : INT* in/out -> (ptr int32_t) *)
(* 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 ("WSCGetProviderPath32" wscget-provider-path32 :convention :stdcall) :int32
  (lp-provider-id :pointer)   ; GUID*
  (lpsz-provider-dll-path :pointer)   ; LPWSTR out
  (lp-provider-dll-path-len :pointer)   ; INT* in/out
  (lp-errno :pointer))   ; INT* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $WSCGetProviderPath32 = Win32::API::More->new('WS2_32',
    'int WSCGetProviderPath32(LPVOID lpProviderId, LPWSTR lpszProviderDllPath, LPVOID lpProviderDllPathLen, LPVOID lpErrno)');
# my $ret = $WSCGetProviderPath32->Call($lpProviderId, $lpszProviderDllPath, $lpProviderDllPathLen, $lpErrno);
# lpProviderId : GUID* -> LPVOID
# lpszProviderDllPath : LPWSTR out -> LPWSTR
# lpProviderDllPathLen : INT* in/out -> LPVOID
# lpErrno : INT* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
公式の関連項目