WSCWriteNameSpaceOrder 函数 (sporder.h)

WSCWriteNameSpaceOrder 函数更改可用 Windows 套接字 (Winsock) 2 个命名空间提供程序的顺序。 命名空间提供程序的顺序决定了枚举或查询名称解析时命名空间的优先级。

语法

int WSCWriteNameSpaceOrder(
  [in] LPGUID lpProviderId,
  [in] DWORD  dwNumberOfEntries
);

参数

[in] lpProviderId

WSANAMESPACE_INFO 结构中找到的 NSProviderId 元素数组。 NSProviderId 元素的顺序是命名空间提供程序的新优先级顺序。

[in] dwNumberOfEntries

NSProviderId 数组中的元素数。

返回值

如果例程成功 函数将返回ERROR_SUCCESS (零) 。 否则,它将返回特定的错误代码。

错误代码 含义
WSAEFAULT
NSProviderId 数组未完全包含在进程地址空间中。
WSAEINVAL
一个或多个参数是输入参数无效,未执行任何操作。
WSANO_RECOVERY
发生不可恢复的错误。 此错误在以下几种情况下返回:用户缺少写入 Winsock 注册表所需的管理权限,或者另一个应用程序当前正在写入命名空间提供程序目录。
WSASYSCALLFAILURE
不应失败的系统调用失败。
WSATRY_AGAIN
函数由另一个线程或进程调用。
WSA_NOT_ENOUGH_MEMORY
内存不足,无法执行该操作。
(其他)
函数可能会返回任何注册表错误代码。

注解

命名空间提供程序是使用 WSCInstallNameSpace 函数安装的。 命名空间提供程序的最初安装顺序控制通过 WSAEnumNameSpaceProviders 枚举它们的默认顺序。 更重要的是,此顺序还控制客户端请求名称解析时考虑命名空间提供程序的顺序。 可以使用 WSCWriteNameSpaceOrder 函数更改命名空间提供程序的顺序。 在 64 位平台上, WSCWriteNameSpaceOrder32 函数用于允许 64 位进程更改 32 位命名空间提供程序目录中命名空间提供程序的顺序。 在 64 位平台上,命名空间提供程序使用 WSCInstallNameSpace32 函数安装在 32 位命名空间提供程序目录中。

当前命名空间提供程序目录存储在注册表中的以下注册表项下: HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Winsock2\Parameters\NameSpace_Catalog5

客户端名称解析请求使用 WSALookupServiceBeginWSALookupServiceNextWSALookupServiceEnd 例程。 传递给 WSALookupServiceBeginWSAQUERYSET 结构的 dwNameSpace 成员设置为单个命名空间 (NS_DNS 的标识符,例如) 约束搜索,或NS_ALL包含所有命名空间。 如果多个命名空间提供程序支持特定命名空间 (NS_DNS(例如,) ),则返回与请求的 dwNameSpace 匹配的所有命名空间提供程序的结果,除非 将 lpNSProviderId 成员设置为特定的命名空间提供程序。 如果为 dwNameSpace 成员指定了 NS_ALL,则返回所有命名空间提供程序的结果。 结果的返回顺序取决于目录中的命名空间提供程序顺序。

Windows SDK 包含一个名为 SpOrder.exe 的应用程序,该应用程序允许显示已安装的命名空间提供程序的目录。 Windows 套接字 2 包含 ws2_32.dll,用于导出 WSCWriteNameSpaceOrder 函数,以便对目录中的命名空间提供程序重新排序。 可以通过与 WS2_32.lib 链接来导入此接口。 对于在 Windows XP 上运行 Service Pack 2 (SP2) 和 Windows Server 2003 Service Pack 1 (SP1) 及更高版本的计算机, netsh.exe winsock show catalog 命令将显示系统上安装的协议和命名空间提供程序。

WSCWriteNameSpaceOrder 只能由以 Administrators 组成员身份登录的用户调用。 如果 WSCWriteNameSpaceOrder 由不是 Administrators 组成员的用户调用,则函数调用将失败,并在 lpErrno 参数中返回WSANO_RECOVERY

对于在 Windows Vista 和 Windows Vista 上运行的计算机,此功能也可能因为用户帐户控制 (UAC) 而失败。 如果包含此函数的应用程序由以管理员组成员身份登录的用户执行,则此调用将失败,除非应用程序已在清单文件中标记为 requestedExecutionLevel 设置为 requireAdministrator。 如果 Windows Vista 和 Windows Vista 上的应用程序在用于生成可执行文件的清单文件中缺少此设置,则以管理员以外的管理员组成员身份登录的用户必须在增强的 shell 中执行应用程序,因为管理员 (RunAs 管理员) 此函数才能成功。

以下列表描述了 WSCWriteNameSpaceOrder 函数可能失败的情况:

  • dwNumberOfEntries 参数不等于已注册的命名空间提供程序的数目。
  • NSProviderId 数组包含无效的命名空间提供程序标识符。
  • NSProviderId 数组一次不包含所有有效的命名空间提供程序标识符。
  • 函数无法访问注册表 (例如,用户权限) 不足。
  • 另一个进程 (或线程) 当前正在调用函数。

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 sporder.h
Library Sporder.lib
DLL Ws2_32.dll

另请参阅

WSAEnumNameSpaceProviders

WSANAMESPACE_INFO

WSAQUERYSET

WSCEnumNameSpaceProviders32

WSCInstallNameSpace

WSCInstallNameSpace32

WSCWriteNameSpaceOrder32