Función RoGetMetaDataFile (rometadataresolution.h)
Busca y recupera el archivo de metadatos que describe la interfaz binaria de la aplicación (ABI) para el nombre de tipo especificado.
Sintaxis
HRESULT RoGetMetaDataFile(
[in] const HSTRING name,
[in, optional] IMetaDataDispenserEx *metaDataDispenser,
[out, optional] HSTRING *metaDataFilePath,
[out, optional] IMetaDataImport2 **metaDataImport,
[out, optional] mdTypeDef *typeDefToken
);
Parámetros
[in] name
Tipo: const HSTRING
Nombre que se va a resolver, ya sea un nombre de tipo o un espacio de nombres. La cadena de entrada de nombre debe no estar vacía y no debe contener caracteres NUL incrustados. Si el nombre es una cadena separada por puntos, la subcadena a la izquierda del último punto y la subcadena a la derecha del último punto debe no estar vacía.
[in, optional] metaDataDispenser
Tipo: IMetaDataDispenserEx*
Un dispensador de metadatos que el autor de la llamada puede pasar opcionalmente para que la función RoGetMetaDataFile pueda abrir los archivos de metadatos a través del método IMetaDataDispenserEx::OpenScope proporcionado. Si el parámetro dispensador de metadatos se establece en nullptr, la función crea una instancia interna del lector de metadatos refactorizado (RoMetadata.dll) y usa su método IMetaDataDispenserEx::OpenScope . Puede crear un dispensador de metadatos mediante la función MetaDataGetDispenser .
[out, optional] metaDataFilePath
Tipo: HSTRING*
Ruta de acceso absoluta del archivo de metadatos (.winmd) que describe la ABI, a menos que se establezca en nullptr. El autor de la llamada es responsable de liberar el HSTRING mediante una llamada al método WindowsDeleteString .
[out, optional] metaDataImport
Tipo: IMetaDataImport2**
Puntero al objeto de lector de archivos de metadatos. Si el autor de la llamada pasa un nullptr , la función libera la referencia IMetaDataImport2 ; de lo contrario, el autor de la llamada debe liberar la referencia. El valor se establece en nullptr en error.
[out, optional] typeDefToken
Tipo: mdTypeDef*
Si la cadena de entrada del nombre se resuelve correctamente como typename, este parámetro se establece en el token del typename.
Si se produce un error, este parámetro se establece en mdTypeDefNil.
Valor devuelto
Tipo: HRESULT
Esta función puede devolver uno de estos valores.
Código devuelto | Descripción |
---|---|
|
La resolución se realizó correctamente, lo que significa que la cadena de entrada representa un tipo definido en un archivo .winmd. |
|
Al menos una de las siguientes propiedades de la cadena de nombre de entrada no contiene:
|
|
La cadena de entrada no es un tipo definido en ningún archivo .winmd examinado. |
|
La cadena de entrada es un espacio de nombres existente en lugar de un nombre de tipo. |
Comentarios
Opcionalmente, el autor de la llamada puede pasar un dispensador de metadatos para la función RoGetMetaDataFile para abrir los archivos de metadatos a través del método IMetaDataDispenserEx::OpenScope .
Si el parámetro dispensador de metadatos se establece en nullptr, la función crea una instancia interna del lector de metadatos refactorizado y usa el método IMetaDataDispenserEx::OpenScope del lector.
Se garantiza que la función RoGetMetaDataFile es segura para subprocesos si pasa nullptr al parámetro del dispensador de metadatos, ya que la función crea un lector de metadatos de solo lectura interno. Esta garantía también se mantiene si pasa el lector de metadatos de solo lectura, como RoMetadata a la función.
Los tres parámetros de salida son opcionales y no es necesario especificar ninguno de ellos. Llamar a la función RoGetMetaDataFile con nullptr para todos los parámetros de salida equivale a preguntar si se define el nombre de tipo de entrada o el espacio de nombres.
La referencia del objeto lector de metadatos y los parámetros del token TypeDef emparejados, por lo que ambos deben establecerse juntos o establecerse en nullptr.
Hay tres posibles escenarios de resolución de tipos:
Escenario 1 |
La cadena de entrada Typename es un tipo definido en un archivo WinMD.
|
Escenario 2 | La cadena de entrada Typename es realmente un espacio de nombres existente en lugar de un nombre de tipo.
|
Escenario 3 | La cadena de entrada no es un tipo definido en ningún archivo WinMD examinado
|
La función RoGetMetaDataFile resuelve un grupo de interfaz, porque el grupo de interfaces también es un typename calificado por el espacio de nombres. El método IInspectable::GetRuntimeClassName devuelve la cadena en formato de cadena separada por puntos para su uso por RoGetMetaDataFile.
No se admite la resolución de tipos de terceros desde un proceso que no está en una aplicación de la Tienda Windows. En este caso, la función devuelve el error HRESULT_FROM_WIN32(ERROR_NO_PACKAGE) y establece los parámetros de salida en nullptr. Pero los tipos de Windows se resuelven en un proceso que no está en una aplicación de la Tienda Windows.
Ejemplos
En el siguiente ejemplo de C++ se muestra cómo usar la función RoGetMetaDataFile para buscar el archivo de metadatos de un nombre de tipo especificado.
#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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 8 [aplicaciones de escritorio | Aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2012 [aplicaciones de escritorio | Aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | rometadataresolution.h |
Library | WindowsApp.lib |
Archivo DLL | WinTypes.dll |