RoGetMetaDataFile 関数 (rometadataresolution.h)
指定した型名のアプリケーション バイナリ インターフェイス (ABI) を記述するメタデータ ファイルを検索して取得します。
構文
HRESULT RoGetMetaDataFile(
[in] const HSTRING name,
[in, optional] IMetaDataDispenserEx *metaDataDispenser,
[out, optional] HSTRING *metaDataFilePath,
[out, optional] IMetaDataImport2 **metaDataImport,
[out, optional] mdTypeDef *typeDefToken
);
パラメーター
[in] name
型: const HSTRING
解決する名前 (型名または名前空間)。 名前入力文字列は空でなく、埋め込み NUL 文字を含めてはなりません。 名前がドット区切りの文字列の場合、最後のドットの左側の部分文字列と最後のドットの右側の部分文字列は空でない必要があります。
[in, optional] metaDataDispenser
種類: IMetaDataDispenserEx*
指定された IMetaDataDispenserEx::OpenScope メソッドを使用してメタデータ ファイルを開くことができるよう、RoGetMetaDataFile 関数の呼び出し元が必要に応じて渡すことができるメタデータ ディスペンサー。 メタデータ ディスペンサー パラメーターが nullptr に設定されている場合、関数はリファクタリングされたメタデータ リーダー (RoMetadata.dll) の内部インスタンスを作成し、その IMetaDataDispenserEx::OpenScope メソッドを 使用します。 メタデータ ディスペンサーは、 MetaDataGetDispenser 関数を使用して作成できます。
[out, optional] metaDataFilePath
型: HSTRING*
nullptr に設定されていない限り、ABI を記述するメタデータ (.winmd) ファイルの絶対パス。 呼び出し元は、WindowsDeleteString メソッドを呼び出して HSTRING を解放します。
[out, optional] metaDataImport
種類: IMetaDataImport2**
メタデータ ファイル リーダー オブジェクトへのポインター。 呼び出し元が nullptr を渡す場合、関数は IMetaDataImport2 参照を 解放します。それ以外の場合、呼び出し元は参照を解放する必要があります。 エラーが発生した場合、値は nullptr に設定されます。
[out, optional] typeDefToken
型: mdTypeDef*
名前入力文字列が型名として正常に解決された場合、このパラメーターは typename のトークンに設定されます。
失敗した場合、このパラメーターは mdTypeDefNil に設定されます。
戻り値
型: HRESULT
この関数は、これらの値のいずれかを返すことができます。
リターン コード | 説明 |
---|---|
|
解決が成功しました。これは、入力文字列が .winmd ファイルで定義されている型を表していることを意味します。 |
|
入力名文字列の次のプロパティの少なくとも 1 つが保持されていません。
|
|
入力文字列は、検査対象の .winmd ファイルで定義された型ではありません。 |
|
入力文字列は、型名ではなく既存の名前空間です。 |
注釈
呼び出し元は、必要に応じて RoGetMetaDataFile 関数のメタデータ ディスペンサーを渡して 、IMetaDataDispenserEx::OpenScope メソッドを使用してメタデータ ファイルを開くことができます。
メタデータ ディスペンサー パラメーターが nullptr に設定されている場合、関数はリファクタリングされたメタデータ リーダーの内部インスタンスを作成し、そのリーダーの IMetaDataDispenserEx::OpenScope メソッドを 使用します。
RoGetMetaDataFile 関数は、nullptr をメタデータ ディスペンサー パラメーターに渡すとスレッド セーフであることが保証されます。この関数は内部読み取り専用メタデータ リーダーを作成するためです。 この保証は、RoMetadata などの読み取り専用メタデータ リーダーを関数に渡す場合にも保持されます。
3 つの出力パラメーターはすべて省略可能であり、いずれも指定する必要はありません。 すべての出力パラメーターに対して nullptr を指定して RoGetMetaDataFile 関数を呼び出すことは、入力型名と名前空間のどちらが定義されているかを確認することと同じです。
メタデータ リーダー オブジェクト参照と TypeDef トークン パラメーターがペアになっています。そのため、両方を一緒に設定するか 、nullptr に設定する必要があります。
次の 3 つの型解決シナリオが考えられます。
シナリオ 1 |
Typename 入力文字列は、WinMD ファイルで定義されている型です。
|
シナリオ 2 | Typename 入力文字列は、実際には型名ではなく既存の名前空間です。
|
シナリオ 3 | 入力文字列は、検査対象の WinMD ファイルで定義された型ではありません
|
RoGetMetaDataFile 関数は、インターフェイス グループも名前空間で修飾された型名であるため、インターフェイス グループを解決します。 IInspectable::GetRuntimeClassName メソッドは、RoGetMetaDataFile で使用するために、ドット区切りの文字列形式で文字列を返します。
Windows ストア アプリにないプロセスからのサード パーティの種類の解決はサポートされていません。 この場合、関数はエラー HRESULT_FROM_WIN32(ERROR_NO_PACKAGE) を 返し、出力パラメーターを nullptr に設定します。 ただし、Windows の種類は、Windows ストア アプリにないプロセスで解決されます。
例
次の C++ の例は、 RoGetMetaDataFile 関数を使用して、指定した型名のメタデータ ファイルを検索する方法を示しています。
#include <windows.h>
#include <stdio.h>
#include <WinRTString.h>
#include <TypeResolution.h>
#include <atlbase.h>
HRESULT PrintMetaDataFilePathForTypeName(PCWSTR pszTypename);
int ShowUsage()
{
wprintf(L"Usage: RoGetMetaDataFileSample TypeName\n");
return -1;
}
int __cdecl wmain(int argc, WCHAR **argv)
{
if (argc != 2)
{
return ShowUsage();
}
HRESULT hr = PrintMetaDataFilePathForTypeName(argv[1]);
if (SUCCEEDED(hr))
{
return 0;
}
else
{
return -1;
}
}
HRESULT PrintMetaDataFilePathForTypeName(PCWSTR pszTypename)
{
HRESULT hr;
HSTRING hstrTypeName = nullptr;
HSTRING hstrMetaDataFilePath = nullptr;
CComPtr<IMetaDataImport2> spMetaDataImport;
mdTypeDef typeDef;
hr = WindowsCreateString(
pszTypename,
static_cast<UINT32>(wcslen(pszTypename)),
&hstrTypeName);
if (SUCCEEDED(hr))
{
hr = RoGetMetaDataFile(
hstrTypeName,
nullptr,
&hstrMetaDataFilePath,
&spMetaDataImport,
&typeDef);
}
if (SUCCEEDED(hr))
{
wprintf(L"Type %s was found in %s\n", pszTypename, WindowsGetStringRawBuffer(hstrMetaDataFilePath, nullptr));
}
else if (hr == RO_E_METADATA_NAME_NOT_FOUND)
{
wprintf(L"Type %s was not found!\n", pszTypename);
}
else
{
wprintf(L"Error %x occurred while trying to resolve %s!\n", hr, pszTypename);
}
// Clean up resources.
if (hstrTypeName != nullptr)
{
WindowsDeleteString(hstrTypeName);
}
if (hstrMetaDataFilePath != nullptr)
{
WindowsDeleteString(hstrMetaDataFilePath);
}
return hr;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8 [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2012 [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | rometadataresolution.h |
Library | WindowsApp.lib |
[DLL] | WinTypes.dll |