Função RoGetMetaDataFile (rometadataresolution.h)
Localiza e recupera o arquivo de metadados que descreve a ABI (Interface Binária de Aplicativo) para o nome de tipo especificado.
Sintaxe
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
O nome a resolve, um nome de tipo ou um namespace. A cadeia de caracteres de entrada de nome deve ser não vazia e não deve conter caracteres NUL inseridos. Se o nome for uma cadeia de caracteres separada por ponto, a subcadeia de caracteres à esquerda do último ponto e a subcadeia de caracteres à direita do último ponto deverão não estar vazias.
[in, optional] metaDataDispenser
Tipo: IMetaDataDispenserEx*
Um distribuidor de metadados que o chamador pode, opcionalmente, passar para a função RoGetMetaDataFile para poder abrir os arquivos de metadados por meio do método IMetaDataDispenserEx::OpenScope fornecido. Se o parâmetro do distribuidor de metadados for definido como nullptr, a função criará uma instância interna do leitor de metadados refatorado (RoMetadata.dll) e usará seu método IMetaDataDispenserEx::OpenScope . Você pode criar um distribuidor de metadados usando a função MetaDataGetDispenser .
[out, optional] metaDataFilePath
Tipo: HSTRING*
O caminho absoluto do arquivo de metadados (.winmd) que descreve a ABI, a menos que definido como nullptr. O chamador é responsável por liberar o HSTRING chamando o método WindowsDeleteString .
[out, optional] metaDataImport
Tipo: IMetaDataImport2**
Um ponteiro para o objeto de leitor de arquivo de metadados. Se o chamador passar em um nullptr , a função liberará a referência IMetaDataImport2 , caso contrário, o chamador deverá liberar a referência. O valor é definido como nullptr em caso de falha.
[out, optional] typeDefToken
Tipo: mdTypeDef*
Se a cadeia de caracteres de entrada de nome for resolvida com êxito como um typename, esse parâmetro será definido como o token do typename.
Em caso de falha, esse parâmetro é definido como mdTypeDefNil.
Retornar valor
Tipo: HRESULT
Essa função pode retornar um desses valores.
Código de retorno | Descrição |
---|---|
|
A resolução foi bem-sucedida, o que significa que a cadeia de caracteres de entrada representa um tipo definido em um arquivo .winmd. |
|
Pelo menos uma das seguintes propriedades da cadeia de caracteres de nome de entrada não contém:
|
|
A cadeia de caracteres de entrada não é um tipo definido em nenhum arquivo .winmd examinado. |
|
A cadeia de caracteres de entrada é um namespace existente em vez de um typename. |
Comentários
Opcionalmente, o chamador pode passar um distribuidor de metadados para a função RoGetMetaDataFile para abrir os arquivos de metadados por meio do método IMetaDataDispenserEx::OpenScope .
Se o parâmetro do distribuidor de metadados for definido como nullptr, a função criará uma instância interna do leitor de metadados refatorado e usará o método IMetaDataDispenserEx::OpenScope desse leitor.
A função RoGetMetaDataFile tem a garantia de ser thread-safe se você passar nullptr para o parâmetro de distribuidor de metadados, pois a função cria um leitor de metadados somente leitura interno. Essa garantia também será mantida se você passar o leitor de metadados somente leitura, como RoMetadata para a função.
Todos os três parâmetros de saída são opcionais e nenhum deles precisa ser especificado. Chamar a função RoGetMetaDataFile com nullptr para todos os parâmetros de saída é equivalente a perguntar se o typename ou o namespace de entrada está definido.
A referência do objeto leitor de metadados e os parâmetros de token TypeDef emparelhados, portanto, ambos devem ser definidos juntos ou definidos como nullptr.
Há três cenários de resolução de tipos possíveis:
Cenário 1 |
A cadeia de caracteres de entrada typename é um tipo definido em um arquivo WinMD.
|
Cenário 2 | A cadeia de caracteres de entrada typename é, na verdade, um namespace existente em vez de um nome de tipo.
|
Cenário 3 | A cadeia de caracteres de entrada não é um tipo definido em nenhum arquivo WinMD examinado
|
A função RoGetMetaDataFile resolve um grupo de interfaces, pois o grupo de interfaces também é um nome de tipo qualificado por namespace. O método IInspectable::GetRuntimeClassName retorna a cadeia de caracteres no formato de cadeia de caracteres separada por ponto para uso por RoGetMetaDataFile.
Não há suporte para resolver tipos de terceiros de um processo que não está em um aplicativo da Windows Store. Nesse caso, a função retorna erro HRESULT_FROM_WIN32(ERROR_NO_PACKAGE) e define parâmetros de saída como nullptr. Mas os tipos do Windows são resolvidos em um processo que não está em um aplicativo da Windows Store.
Exemplos
O exemplo C++ a seguir mostra como usar a função RoGetMetaDataFile para localizar o arquivo de metadados para um nome 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 | Valor |
---|---|
Cliente mínimo com suporte | Windows 8 [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2012 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | rometadataresolution.h |
Biblioteca | WindowsApp.lib |
DLL | WinTypes.dll |