LPWSCWRITENAMESPACEORDER
コールバックシグネチャ
INT LPWSCWRITENAMESPACEORDER(
GUID* lpProviderId,
DWORD dwNumberOfEntries
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| lpProviderId | GUID* | WSANAMESPACE_INFO 構造体に含まれる NSProviderId 要素の配列です。NSProviderId 要素の順序が、ネームスペースプロバイダーの新しい 優先順位になります。 |
| dwNumberOfEntries | DWORD | NSProviderId 配列の要素数です。 |
公式ドキュメント
WSCWriteNameSpaceOrder 関数は、利用可能な Windows Sockets (Winsock) 2 ネームスペースプロバイダーの順序を変更します。ネームスペースプロバイダーの順序は、列挙時や名前解決のクエリ時におけるネームスペースの優先度を決定します。
戻り値
関数が成功した場合は ERROR_SUCCESS (0) を返します。それ以外の場合は、固有のエラーコードを返します。
| エラーコード | 意味 |
|---|---|
| NSProviderId 配列がプロセスのアドレス空間内に完全に含まれていません。 | |
| 1 つ以上の入力パラメーターが無効であり、処理は行われませんでした。 | |
| 回復不能なエラーが発生しました。このエラーは、次を含むいくつかの条件で返されます。Winsock レジストリへの書き込みに必要な管理者権限をユーザーが持っていない場合や、他のアプリケーションが現在ネームスペースプロバイダーカタログに書き込みを行っている場合などです。 | |
| 決して失敗しないはずのシステムコールが失敗しました。 | |
| この関数が別のスレッドまたはプロセスから呼び出されています。 | |
| 操作を実行するのに十分なメモリーがありませんでした。 | |
|
この関数は、任意のレジストリエラーコードを返すことがあります。 |
解説(Remarks)
ネームスペースプロバイダーは WSCInstallNameSpace 関数を使用してインストールします。ネームスペースプロバイダーが最初にインストールされた順序が、 WSAEnumNameSpaceProviders で列挙されるときの既定の順序を決定します。さらに重要なことに、この順序は、クライアントが名前解決を要求したときにネームスペースプロバイダーが検討される順序も決定します。ネームスペースプロバイダーの順序は WSCWriteNameSpaceOrder 関数で変更できます。64 ビットプラットフォームでは、64 ビットプロセスが 32 ビットのネームスペースプロバイダーカタログ内の順序を変更できるように、WSCWriteNameSpaceOrder32 関数が提供されています。64 ビットプラットフォームでは、32 ビットのネームスペースプロバイダーカタログへのネームスペースプロバイダーのインストールに WSCInstallNameSpace32 関数を使用します。
現在のネームスペースプロバイダーカタログは、次のレジストリキーの下に格納されています。HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Winsock2\Parameters\NameSpace_Catalog5
クライアントからの名前解決要求には、WSALookupServiceBegin、WSALookupServiceNext、WSALookupServiceEnd の各ルーチンを使用します。WSALookupServiceBegin に渡す WSAQUERYSET 構造体の dwNameSpace メンバーには、検索を限定する単一のネームスペースの識別子 (例: NS_DNS) を設定するか、すべてのネームスペースを対象にする場合は NS_ALL を設定します。複数のネームスペースプロバイダーが特定のネームスペース (例: NS_DNS) をサポートしている場合、lpNSProviderId メンバーで特定のネームスペースプロバイダーを指定しない限り、要求された dwNameSpace に一致するすべてのネームスペースプロバイダーからの結果が返されます。dwNameSpace メンバーに NS_ALL を指定した場合は、すべてのネームスペースプロバイダーからの結果が返されます。結果が返される順序は、カタログ内のネームスペースプロバイダーの順序に依存します。
Windows SDK には、インストール済みのネームスペースプロバイダーのカタログを表示できる SpOrder.exe というアプリケーションが含まれています。Windows Sockets 2 には、カタログ内のネームスペースプロバイダーを並べ替える WSCWriteNameSpaceOrder 関数をエクスポートする ws2_32.dll が含まれています。このインターフェイスは WS2_32.lib をリンクすることでインポートできます。Windows XP Service Pack 2 (SP2) および Windows Server 2003 Service Pack 1 (SP1) 以降を実行するコンピューターでは、netsh.exe winsock show catalog コマンドによって、システムにインストールされているプロトコルプロバイダーとネームスペースプロバイダーの両方が表示されます。
WSCWriteNameSpaceOrder は、Administrators グループのメンバーとしてログオンしているユーザーのみが呼び出せます。Administrators グループのメンバーでないユーザーが WSCWriteNameSpaceOrder を呼び出した場合、関数呼び出しは失敗し、lpErrno パラメーターに WSANO_RECOVERY が返されます。
Windows Vista および Windows Vista を実行するコンピューターでは、ユーザーアカウント制御 (UAC) によってもこの関数は失敗することがあります。この関数を含むアプリケーションを、Administrator 以外の Administrators グループのメンバーとしてログオンしているユーザーが実行した場合、マニフェストファイルで requestedExecutionLevel が requireAdministrator に設定されていない限り、この呼び出しは失敗します。Windows Vista および Windows Vista で、実行ファイルのビルドに使用したマニフェストファイルにこの設定がない場合、Administrator 以外の Administrators グループのメンバーとしてログオンしているユーザーは、この関数を成功させるために、Administrator として昇格させたシェル (RunAs administrator) でアプリケーションを実行する必要があります。
次の一覧は、 WSCWriteNameSpaceOrder 関数が失敗する可能性のあるシナリオを示します。
- dwNumberOfEntries パラメーターが、登録されたネームスペースプロバイダーの数と一致しない。
- NSProviderId 配列に無効なネームスペースプロバイダー識別子が含まれている。
- NSProviderId 配列に、有効なネームスペースプロバイダー識別子がすべて、それぞれ正確に 1 回ずつ含まれていない。
- 関数がレジストリにアクセスできない (例: ユーザーの権限不足)。
- 別のプロセス (またはスレッド) が現在この関数を呼び出している。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)