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

IGetClusterResourceInfo

COM
IID97dede55-fc6b-11cf-b5f5-00a0c90ab505継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

リソースに関する情報を取得するために、フェールオーバー クラスター アドミニストレーターの拡張機能から呼び出されます。

解説(Remarks)

拡張対象のオブジェクトがリソースでない場合、 IGetClusterResourceInfo のメソッドに対するクエリは失敗します。 それ以外の場合は、フェールオーバー クラスター アドミニストレーターが次のメソッドの実装を呼び出す際に、 IGetClusterResourceInfo インターフェイスを使用できます。

フェールオーバー クラスター アドミニストレーターは、IUnknown ポインター piData を渡します。piData を使用して QueryInterface を呼び出し、 IGetClusterResourceInfo のメソッドを取得してください。

IGetClusterResourceInfo インターフェイスは、リソース拡張のコンテキストでのみ使用してください。 IGetClusterGroupInfo などの他の情報インターフェイスを、 IGetClusterResourceInfo インターフェイスから取得しないでください。 QueryInterface は有効なインターフェイスを返しますが、 その操作はクラスターのコンテキストでは有効ではなく、 結果として実在するクラスター オブジェクトを表さないインターフェイスが得られます。

次のコードのうち、C スタイルのコメントで囲まれた部分は、前述の理由により失敗します。

//
// Context is a resource extension.
//
HRESULT CExtObject::HrGetResourceInfo( IGetClusterResourceInfo *piResInfo )
 {
  HRESULT   hr;
  HRESOURCE hRes;
  HGROUP    hGroup;
  HCLUSTER  hCluster;
  DWORD     cchNameSize = MAX_NAME_SIZE; // 256
  WCHAR     szGroupName[cchNameSize];

  IGetClusterGroupInfo *pGrpInfo;

  hRes = piResInfo->GetResourceHandle();

  //
  // Get group handle
  //
/*******************************************************************
// Incorrect:

  //
  // Obtain an IGetClusterGroupInfo interface from 
  // IGetClusterResourceInfo. By the rules of QueryInterface, this 
  // must return a valid interface. But it is not a valid cluster 
  // operation so the interface won't represent a real object.
  //
  hr = pResInfo->QueryInterface( IID_IGetClusterGroupInfo, 
                                 (LPVOID *) &pGrpInfo );

  //
  // Interface is valid, will pass this test.
  //
  if( FAILED( hr ) )
    goto Error;

  //
  // FAILS!
  // Interface does not represent a real cluster object.
  //    
  hGrp = pGrpInfo->GetGroupHandle( 0 );

*******************************************************************/
// Correct:    
  //
  // Use the valid resource handle to call GetClusterResourceState.
  // This yields the name of the group to which it belongs, which
  // can be used to obtain a group handle.
  //
  dwState = GetClusterResourceState( hRes,
                                     NULL,
                                     0,
                                     szGroupName,
                                     &cchGroupNameSize );

  // Add error check.

  hCluster = OpenCluster( g_szClusterName );

  // Add error check.

  hGrp = OpenClusterGroup( hCluster, szGroupName );

  // After error check, use group handle...

 }

メソッド 3

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESOURCE GetResourceHandle(INT lObjIndex)

リソースのハンドルを返します。

lObjIndexINTin対象リソースの 0 から始まるインデックスを表す数値です。lObjIndex は、 IGetClusterDataInfo::GetObjectCount を呼び出して取得できる数に制限されます。

戻り値

GetResourceHandle が成功した場合は、 lObjIndex で表されるリソースのハンドルを返します。

GetResourceHandle が失敗した場合は、 NULL を返します。エラーの詳細については、 関数 GetLastError を呼び出してください。

vtbl 4 HRESULT GetResourceTypeName(INT lObjIndex, LPWSTR lpszResTypeName, INT* pcchResTypeName)

リソースの種類を返します。

lObjIndexINTin対象リソースの 0 から始まるインデックスを表す数値です。lObjIndex は、 IGetClusterDataInfo::GetObjectCount を呼び出して取得できる数に制限されます。
lpszResTypeNameLPWSTRoutlObjIndex に対応するリソースの種類へのポインターです。 lpResTypeName パラメーターには NULL を指定でき、その場合は呼び出し元が リソースの種類の長さのみを要求していることを示します。 このパラメーターは BSTR として宣言されていますが、実際には LPWSTR として実装されています。
pcchResTypeNameINT*inout入力時は、lpResTypeName パラメーターが指すバッファーの文字数へのポインターです。 pcchResTypeName パラメーターに NULL を指定することはできません。 出力時は、lpResTypeName の内容に格納されたリソースの種類の名前の文字数 (NULL 終端文字を含む) へのポインターです。

戻り値

GetResourceTypeName が失敗した場合は、これ以外の HRESULT 値を返すことがあります。

リターン コード/値 説明
NOERROR
0
操作は成功しました。
E_INVALIDARG
0x80070057
1 つ以上のパラメーターが無効です。
HRESULT_FROM_WIN32(ERROR_MORE_DATA)
0x800700ea
lpResTypeName が指すバッファーが小さすぎるため、要求されたリソースの種類を格納できません。 GetResourceTypeName は、必要な文字数を pcchResTypeName の内容として返します。
vtbl 5 BOOL GetResourceNetworkName(INT lObjIndex, LPWSTR lpszNetName, DWORD* pcchNetName)

リソースが依存する Network Name リソースによって管理されているネットワークの名前を返します。

lObjIndexINTin対象リソースの 0 から始まるインデックスを表す数値です。対象リソースは Network Name リソースに依存している場合もあれば、 依存していない場合もあります。lObjIndex は、 IGetClusterDataInfo::GetObjectCount を呼び出して取得できる数に制限されます。
lpszNetNameLPWSTRoutlObjIndex でインデックス指定されるリソースが依存するネットワークの名前を格納する、 null 終端の Unicode 文字列へのポインターです。このパラメーターは BSTR として宣言されていますが、実際には LPWSTR として実装されています。
pcchNetNameDWORD*inoutlpszNetName が指すバッファーの最大文字数へのポインターです。 入力時、この値は MAX_COMPUTERNAME_LENGTH + 1 文字を格納できる大きさである必要があります。 出力時、pcchNetNamelpszNetName の内容に実際にコピーされた文字数を指します。

戻り値

リターン コード/値 説明
TRUE
1
lObjIndex でインデックス指定されるリソースは Network Name リソースへの 依存関係を持ち、ネットワークの名前が正常に返されました。
FALSE
0
lObjIndex でインデックス指定されるリソースは、Network Name リソースへの依存関係を持ちません。

解説(Remarks)

GetResourceNetworkName メソッドは、 フェールオーバー クラスター アドミニストレーターの拡張プロパティ ページが、 リソースに Network Name リソースへの既存の依存関係または保留中の依存関係があるかどうかを判断できるようにするために必要です。

ネットワークの名前は、Network Name リソースの Name プライベート プロパティに格納されます。Network Name リソースの Name 共通プロパティは、ネットワークの名前ではなくリソースの名前です。

MAX_COMPUTERNAME_LENGTH は、Windows ヘッダー ファイル WinBase.h で 15 として定義されている定数です。

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

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IGetClusterResourceInfo "{97DEDE55-FC6B-11CF-B5F5-00A0C90AB505}"
#usecom global IGetClusterResourceInfo IID_IGetClusterResourceInfo "{}"
#comfunc global IGetClusterResourceInfo_GetResourceHandle       3 int
#comfunc global IGetClusterResourceInfo_GetResourceTypeName     4 int,var,var
#comfunc global IGetClusterResourceInfo_GetResourceNetworkName  5 int,var,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。