RoGetParameterizedTypeInstanceIID 函数 (roparameterizediid.h)

计算接口标识符 (接口或委托类型的 IID) ,当参数化接口或委托使用指定的类型参数实例化时得到。

语法

HRESULT RoGetParameterizedTypeInstanceIID(
                  UINT32                     nameElementCount,
  [in]            PCWSTR                     *nameElements,
  [in]            const IRoMetaDataLocator & metaDataLocator,
  [out]           GUID                       *iid,
  [out, optional] ROPARAMIIDHANDLE           *pExtra
);

参数

nameElementCount

类型: UINT32

nameElements 中的元素数。

[in] nameElements

类型: PCWSTR*

已分析Windows 运行时类型名称,由 RoParseTypeName 函数返回。 例如,“Windows.Foundation.Collections.IVector'1”和“N1”。N2。IFoo”。

[in] metaDataLocator

类型: const IRoMetaDataLocator

用于解析元数据的回调。

实现应使用 RoGetMetaDataFile 函数发现必要的元数据 (.winmd) 文件,并检查元数据以确定必要的类型信息。 由于 RoGetMetaDataFile 函数不缓存结果,因此定位器应根据所实现的编程模型适当缓存结果。

[out] iid

类型: GUID*

nameElements 对应的接口或委托的 IID。

[out, optional] pExtra

类型: ROPARAMIIDHANDLE*

nameElements 对应的 IID 的句柄。

返回值

类型: HRESULT

返回代码 说明
S_OK
调用成功。
E_OUTOFMEMORY
可用内存不足,无法完成任务。
E_INVALIDARG
为参数化类型提供了错误数量的类型参数。
 

如果类型不适合其出现的上下文,也可能发生失败。

注解

RoGetParameterizedTypeInstanceIID 函数供编程语言实现者使用。

此函数是无状态函数。 metaDataLocator 参数不会在调用之间保留,一旦调用返回,就可以释放该参数。

RoGetParameterizedTypeInstanceIID 函数不执行深度语义分析。 例如,如果 IRoSimpleMetaDataBuilder 指定结构包含接口指针,则此函数返回成功,即使此类元数据在语义上无效。 在这种情况下,返回的 IID 的值未指定。

此函数可能以递归方式调用作为参数提供的元数据定位符。

如果对 IRoSimpleMetaDataBuilder 函数的调用失败,此函数将返回该失败代码。

示例


#include <stdlib.h>
#include <windows.h>
#include <winrt/paraminstanceapi.h>

HRESULT ExampleMetadataLocator(
    PCWSTR name, 
    IRoSimpleMetaDataBuilder& builder)
{
    if (wcscmp(L"Example.IParam`1", name) == 0)
    {
        GUID piidParam= { /* 22046e87-28b5-4c53-9804-bc69f6ee0299 */
            0x22046e87,
            0x28b5,
            0x4c53,
            {0x98, 0x04, 0xbc, 0x69, 0xf6, 0xee, 0x02, 0x99}
        };
        builder.SetParameterizedInterface(piidParam, 1);
    }
    else if (wcscmp(L"Example.InterfaceGroup", name) == 0)
    {
        builder.SetInterfaceGroupSimpleDefault(name, L"Example.IFoo", nullptr);
    }
    else if (wcscmp(L"Example.IFoo", name) == 0)
    {
        GUID iidFoo = { /* f7f968c2-b1d8-47e0-98db-1b04f2bba657 */
            0xf7f968c2,
            0xb1d8,
            0x47e0,
            {0x98, 0xdb, 0x1b, 0x04, 0xf2, 0xbb, 0xa6, 0x57}
        };
        builder.SetWinRtInterface(iidFoo);
    }
    return E_ABORT;
}

int main()
{
    // example, compute IID
    GUID iidResult;
    PCWSTR names = { L"Example.IParam`1", L"Example.InterfaceGroup" };
    HRESULT hr = RoGetParameterizedTypeInstanceIID(
        2,
        names,
        Ro::Locator(&ExampleMetadataLocator),
        &iidResult);
}


要求

要求
最低受支持的客户端 Windows 8 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2012 [桌面应用 |UWP 应用]
目标平台 Windows
标头 roparameterizediid.h
DLL Api-ms-win-core-winrt-roparameterizediid-l1-1-0.dll