GetClassFile 関数 (objbase.h)
指定したファイル名に関連付けられている CLSID を返します。
構文
HRESULT GetClassFile(
[in] LPCOLESTR szFilename,
[out] CLSID *pclsid
);
パラメーター
[in] szFilename
関連付けられた CLSID を要求するファイル名へのポインター。
[out] pclsid
関連する CLSID が戻り時に書き込まれる場所へのポインター。
戻り値
この関数は、ファイル システム エラーと次の値を返すことができます。
リターン コード | 説明 |
---|---|
|
CLSID が正常に取得されました。 |
|
指定したファイル名を開くことができません。 |
|
レジストリで指定された拡張機能が無効です。 |
注釈
ファイル名を指定すると、 GetClassFile はそのファイルに関連付けられている CLSID を検索します。 その使用例は、ファイル名が渡され、関連付けられた CLSID が必要な OleCreateFromFile 関数と、 IMoniker::BindToObject の OLE 実装で使用されます。この関数は、ファイル ベースのドキュメントへのリンクがアクティブになると、 GetClassFile を呼び出してファイルを開くことができるオブジェクト アプリケーションを見つけます。
GetClassFile では、次の方法を使用して適切な CLSID を決定します。
- StgIsStorageFile 関数の呼び出しによって決定されるストレージ オブジェクトがファイルに含まれている場合、GetClassFile は IStorage::SetClass メソッドで書き込まれた CLSID を返します。
-
ファイルがストレージ オブジェクトでない場合、 GetClassFile は、ファイル内のさまざまなビットをレジストリ内のパターンと照合しようとします。 レジストリのパターンには、フォームの一連のエントリを含めることができます。
entry = offset, cb, mask, value
オフセット項目の値は、ファイルの先頭または末尾からのオフセットであり、cb 項目はバイト単位の長さです。 これら 2 つの値は、ファイル内の特定のバイト範囲を表します。 (オフセット項目の負の値は、ファイルの末尾から解釈されます)。 マスク値は、offset および cb で指定されたバイト範囲で論理 AND 演算を実行するために使用されるビットマスクです。 論理 AND 演算の結果が 値 項目と比較されます。 マスクを省略した場合は、すべてと見なされます。
レジストリ内の各パターンは、データベース内のパターンの順序でファイルと比較されます。 各値項目が AND 操作の結果と一致する最初のパターンによって、ファイルの CLSID が決まります。 たとえば、レジストリの次のエントリに含まれるパターンでは、最初の 4 バイトを AB CD 12 34 にし、最後の 4 バイトを FE FE FE FE にする必要があります。
HKEY_CLASSES_ROOT FileType {12345678-0000-0001-C000-000000000095} 0 = 0, 4, FFFFFFFF, ABCD1234 1 = -4, 4, , FEFEFEFE
ファイルにこのようなパターンが含まれている場合、CLSID {12345678-0000-0001-C000-00000000095} がこのファイルに関連付けられます。
- 上記の方法が失敗した場合、 GetClassFile は 、ファイル 名の .ext 部分に対応するレジストリ内のファイル拡張子キーを検索します。 データベース エントリに有効な CLSID が含まれている場合、 GetClassFile はその CLSID を返します。
- すべての戦略が失敗した場合、関数はMK_E_INVALIDEXTENSIONを返します。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | objbase.h |
Library | Ole32.lib |
[DLL] | Ole32.dll |
API セット | ext-ms-win-com-ole32-l1-1-5 (Windows 10 バージョン 10.0.15063 で導入) |