IGetClusterResourceInfo
COM公式ドキュメント
リソースに関する情報を取得するために、フェールオーバー クラスター アドミニストレーターの拡張機能から呼び出されます。
解説(Remarks)
拡張対象のオブジェクトがリソースでない場合、 IGetClusterResourceInfo のメソッドに対するクエリは失敗します。 それ以外の場合は、フェールオーバー クラスター アドミニストレーターが次のメソッドの実装を呼び出す際に、 IGetClusterResourceInfo インターフェイスを使用できます。
- IWEExtendPropertySheet::CreatePropertySheetPages
- IWEExtendContextMenu::AddContextMenuItems
- IWEExtendWizard::CreateWizardPages
- IWEExtendWizard97::CreateWizard97Pages
- IWEInvokeCommand::InvokeCommand
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。
リソースのハンドルを返します。
| lObjIndex | INT | in | 対象リソースの 0 から始まるインデックスを表す数値です。lObjIndex は、 IGetClusterDataInfo::GetObjectCount を呼び出して取得できる数に制限されます。 |
戻り値
GetResourceHandle が成功した場合は、 lObjIndex で表されるリソースのハンドルを返します。
GetResourceHandle が失敗した場合は、 NULL を返します。エラーの詳細については、 関数 GetLastError を呼び出してください。
リソースの種類を返します。
| lObjIndex | INT | in | 対象リソースの 0 から始まるインデックスを表す数値です。lObjIndex は、 IGetClusterDataInfo::GetObjectCount を呼び出して取得できる数に制限されます。 |
| lpszResTypeName | LPWSTR | out | lObjIndex に対応するリソースの種類へのポインターです。 lpResTypeName パラメーターには NULL を指定でき、その場合は呼び出し元が リソースの種類の長さのみを要求していることを示します。 このパラメーターは BSTR として宣言されていますが、実際には LPWSTR として実装されています。 |
| pcchResTypeName | INT* | inout | 入力時は、lpResTypeName パラメーターが指すバッファーの文字数へのポインターです。 pcchResTypeName パラメーターに NULL を指定することはできません。 出力時は、lpResTypeName の内容に格納されたリソースの種類の名前の文字数 (NULL 終端文字を含む) へのポインターです。 |
戻り値
GetResourceTypeName が失敗した場合は、これ以外の HRESULT 値を返すことがあります。
| リターン コード/値 | 説明 |
|---|---|
|
操作は成功しました。 |
|
1 つ以上のパラメーターが無効です。 |
|
lpResTypeName が指すバッファーが小さすぎるため、要求されたリソースの種類を格納できません。 GetResourceTypeName は、必要な文字数を pcchResTypeName の内容として返します。 |
リソースが依存する Network Name リソースによって管理されているネットワークの名前を返します。
| lObjIndex | INT | in | 対象リソースの 0 から始まるインデックスを表す数値です。対象リソースは Network Name リソースに依存している場合もあれば、 依存していない場合もあります。lObjIndex は、 IGetClusterDataInfo::GetObjectCount を呼び出して取得できる数に制限されます。 |
| lpszNetName | LPWSTR | out | lObjIndex でインデックス指定されるリソースが依存するネットワークの名前を格納する、 null 終端の Unicode 文字列へのポインターです。このパラメーターは BSTR として宣言されていますが、実際には LPWSTR として実装されています。 |
| pcchNetName | DWORD* | inout | lpszNetName が指すバッファーの最大文字数へのポインターです。 入力時、この値は MAX_COMPUTERNAME_LENGTH + 1 文字を格納できる大きさである必要があります。 出力時、pcchNetName は lpszNetName の内容に実際にコピーされた文字数を指します。 |
戻り値
| リターン コード/値 | 説明 |
|---|---|
|
lObjIndex でインデックス指定されるリソースは Network Name リソースへの 依存関係を持ち、ネットワークの名前が正常に返されました。 |
|
lObjIndex でインデックス指定されるリソースは、Network Name リソースへの依存関係を持ちません。 |
解説(Remarks)
GetResourceNetworkName メソッドは、 フェールオーバー クラスター アドミニストレーターの拡張プロパティ ページが、 リソースに Network Name リソースへの既存の依存関係または保留中の依存関係があるかどうかを判断できるようにするために必要です。
ネットワークの名前は、Network Name リソースの Name プライベート プロパティに格納されます。Network Name リソースの Name 共通プロパティは、ネットワークの名前ではなくリソースの名前です。
MAX_COMPUTERNAME_LENGTH は、Windows ヘッダー ファイル WinBase.h で 15 として定義されている定数です。
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 方式にも切替可。#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,sptr,sptr #comfunc global IGetClusterResourceInfo_GetResourceNetworkName 5 int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。