IVdsVolumeShrink
COM公式ドキュメント
ボリュームの縮小をサポートするメソッドを提供します。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
現在のボリュームから解放できる最大バイト数を取得します。
| pullMaxNumberOfReclaimableBytes | ULONGLONG* | out | 正常に完了すると、現在のボリュームから解放できる最大バイト数を受け取る変数へのポインター。この数値は常にファイルシステムのクラスターサイズの倍数となり、クラスターサイズはさらにディスクのセクターサイズの倍数となります。このパラメーターは必須であり、null にすることはできません。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換されたシステムエラーコードを返すこともあります。エラーは VDS 自体、または使用されている基盤の VDS プロバイダーから発生する可能性があります。返される可能性のある値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
|
ファイルシステムがサポートしていないため、ボリュームを縮小できません。 |
|
この操作はリムーバブルメディアではサポートされていません。 |
|
pullMaxNumberOfReclaimableBytes パラメーターが入力時に null でした。 |
解説(Remarks)
このメソッドは、実際に利用可能なバイト数よりも多くの解放可能なバイト数を返すことがあります。
ボリュームとすべてのプレックスを縮小し、解放されたエクステントを返します。
| ullDesiredNumberOfReclaimableBytes | ULONGLONG | in | ボリュームのサイズを縮小する最大バイト数。このパラメーターの値は、ullMinNumberOfReclaimableBytes パラメーターの値以上でなければなりません。指定されたバイト数がファイルシステムのクラスターサイズの倍数でない場合、Shrink メソッドはこの値をファイルシステムのクラスターサイズの次の倍数に切り上げます。 |
| ullMinNumberOfReclaimableBytes | ULONGLONG | in | ボリュームのサイズを縮小する最小バイト数。ボリュームサイズを少なくともこのバイト数だけ縮小できない場合、Shrink メソッドは失敗します。指定されたバイト数がファイルシステムのクラスターサイズの倍数でない場合、Shrink メソッドはこの値をファイルシステムのクラスターサイズの次の倍数に切り上げます。Shrink メソッドが成功するために必要な解放可能バイト数の最小値がないことを示すには、ゼロを指定します。 |
| ppAsync | IVdsAsync** | out | IVdsAsync インターフェイスポインターのアドレス。VDS は復帰時にこのインターフェイスを初期化します。呼び出し元はこのインターフェイスを解放する必要があります。このインターフェイスを使用して、操作のキャンセル、完了待機、または状態の照会を行います。IVdsAsync::Wait が呼び出されて成功を示す HRESULT 値が返された場合、VDS_ASYNC_OUTPUT 構造体で返されたインターフェイスは、各インターフェイスポインターに対して IUnknown::Release メソッドを呼び出して解放する必要があります。ただし、Wait が失敗を示す HRESULT 値を返した場合、または Wait の pHrResult パラメーターが失敗を示す HRESULT 値を受け取った場合、VDS_ASYNC_OUTPUT 構造体内のインターフェイスポインターは NULL であり、解放する必要はありません。成功または失敗の HRESULT 値は、Winerror.h で定義されている SUCCEEDED マクロおよび FAILED マクロを使用して判定できます。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換されたシステムエラーコードを返すこともあります。エラーは VDS 自体、または使用されている基盤の VDS プロバイダーから発生する可能性があります。返される可能性のある値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
| メソッドは正常に完了しました。 | |
|
ファイルシステムがサポートしていないため、ボリュームを縮小できません。 |
|
この操作はリムーバブルメディアではサポートされていません。 |
|
内部エラーが発生しました。詳細についてはイベントログを確認してください。 |
|
ボリュームの到着通知を受信しませんでした。IVdsService::Refresh を呼び出す必要がある場合があります。 |
|
指定された縮小サイズが大きすぎるため、ボリュームが最小ボリュームサイズより小さくなります。 |
|
指定された縮小サイズが、許可される最小縮小サイズを下回っています。 |
|
ボリュームが正常な状態ではありません。 |
|
この操作はシンプルボリュームまたはスパンボリュームでのみサポートされています。 |
解説(Remarks)
Shrink メソッドは、ボリュームの末尾に空き領域を集約するために、ファイルをできるだけボリュームの先頭に近づけて移動します。(ボリュームの末尾に集約できる空き領域の量によって、ボリュームをどれだけ縮小できるかが決まります。) 次に、ファイルシステムボリュームを切り詰めてサイズを縮小し、その後パーティションまたはダイナミックボリュームを切り詰めます。
ほとんどの場合、移動できないファイル(つまり、移動不可能なファイル)がいくつか存在します。たとえば、ファイルシステムや記憶域ドライバーのメタデータファイルは移動できない可能性が高いです。このため、ボリュームを縮小できる量は、通常、ボリューム上の空き領域の合計よりも少なくなります。
移動できないファイルの数や配置は、両方のコンピューターが同一に構成されている場合でも、コンピューターごとに異なることがあります。
ファイルが一時的に移動できない状態になることもあります。このため、アプリケーションが同じパラメーターでこのメソッドを再度呼び出すと、追加の領域を回収できる場合があります。
ullDesiredNumberOfReclaimableBytes パラメーターと ullMinNumberOfReclaimableBytes パラメーターの両方がゼロの場合、Shrink メソッドはボリュームを可能な限り縮小します。
縮小操作と拡張操作は、NTFS ボリュームと RAW ボリュームでのみサポートされています。
このメソッドを使用して、ファイルシステムとボリュームを縮小します。VDS がボリュームの縮小に失敗した場合、ファイルシステムを縮小せずに操作を停止します。
各ボリュームでは、一度に 1 つの縮小操作またはデフラグ操作のみを実行できます。Windows Server 2008 および Windows Vista: コンピューターでは、一度に 1 つの縮小操作またはデフラグ操作のみを実行できます。
実装者は、呼び出しが非同期操作を開始しない場合でも、このメソッドに対して IVdsAsync インターフェイスへのポインターを返す必要があります。
このメソッドは IVdsVolume::Shrink メソッドと同一です。
IVdsVolumeShrink::QueryMaxReclaimableBytes メソッドを使用して、縮小操作によって解放されるバイト数を見積もることができます。ただし、QueryMaxReclaimableBytes は実際に利用可能なバイト数よりも多くのバイト数を返すことがあります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVdsVolumeShrink "{D68168C9-82A2-4F85-B6E9-74707C49A58F}" #usecom global IVdsVolumeShrink IID_IVdsVolumeShrink "{}" #comfunc global IVdsVolumeShrink_QueryMaxReclaimableBytes 3 var #comfunc global IVdsVolumeShrink_Shrink 4 int64,int64,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IVdsVolumeShrink "{D68168C9-82A2-4F85-B6E9-74707C49A58F}" #usecom global IVdsVolumeShrink IID_IVdsVolumeShrink "{}" #comfunc global IVdsVolumeShrink_QueryMaxReclaimableBytes 3 sptr #comfunc global IVdsVolumeShrink_Shrink 4 int64,int64,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。