Sdílet prostřednictvím


Integrace WRL (C++/CX)

Kód WRL můžete volně kombinovat s kódem knihovny šablon jazyka C++ (WRL) prostředí Windows Runtime. Ve stejné jednotce překladu můžete použít objekty deklarované pomocí zápisu WRL handle-to-object (^) a zápisu inteligentního ukazatele WRL (ComPtr<T>). Musíte však ručně zpracovat návratové hodnoty a kódy chyb WRL HRESULT a výjimky knihovny WRL.

Vývoj WRL

Další informace o vytváření a využívání komponent knihovny WRL najdete v tématu prostředí Windows Runtime knihovna šablon jazyka C++ (WRL).

Příklad

Následující fragment kódu ukazuje použití knihovny WRL a WRL ke zpracování prostředí Windows Runtime tříd a prozkoumání souboru metadat.

Příklad je převzat z fragmentu kódu ve fóru Pro vytváření aplikací pro Microsoft Store. Autor tohoto fragmentu kódu nabízí následující právní omezení a ujednání:

  1. C++ neposkytuje specifická rozhraní API, která se mají odrážet u typů prostředí Windows Runtime, ale soubory metadat Windows (.winmd) pro typ jsou plně kompatibilní se soubory metadat CLR. Systém Windows poskytuje nová rozhraní API pro zjišťování metadat (RoGetMetaDataFile) pro přístup k souboru .winmd pro daný typ. Tato rozhraní API jsou však omezena na vývojáře jazyka C++, protože není možné vytvořit instanci třídy.

  2. Po kompilaci kódu budete také muset předat objekt Runtimeobject.lib a Rometadata.lib do linkeru.

  3. Tento fragment kódu se zobrazí tak, jak je. I když se očekává, že funguje správně, může obsahovat chyby.

#include <hstring.h>
#include <cor.h>
#include <rometadata.h>
#include <rometadataresolution.h>
#include <collection.h>

namespace ABI_Isolation_Workaround {
    #include <inspectable.h>
    #include <WeakReference.h>
}
using namespace ABI_Isolation_Workaround;
#include <wrl/client.h>

using namespace Microsoft::WRL;
using namespace Windows::Foundation::Collections;

IVector<String^>^ GetTypeMethods(Object^);

MainPage::MainPage()
{
    InitializeComponent();

    Windows::Foundation::Uri^ uri = ref new Windows::Foundation::Uri("http://buildwindows.com/");
    auto methods = GetTypeMethods(uri);

    std::wstring strMethods;
    std::for_each(begin(methods), end(methods), [&strMethods](String^ methodName) {
        strMethods += methodName->Data();
        strMethods += L"\n";
    });

    wprintf_s(L"%s\n", strMethods.c_str());
}

IVector<String^>^ GetTypeMethods(Object^ instance)
{
    HRESULT hr;
    HSTRING hStringClassName;
    hr = instance->__cli_GetRuntimeClassName(reinterpret_cast<__cli_HSTRING__**>(&hStringClassName)); // internal method name subject to change post BUILD
    if (FAILED(hr))
        __cli_WinRTThrowError(hr); // internal method name subject to change post BUILD
    String^ className = reinterpret_cast<String^>(hStringClassName);

    ComPtr<IMetaDataDispenserEx> metadataDispenser; ComPtr<IMetaDataImport2> metadataImport; hr = MetaDataGetDispenser(CLSID_CorMetaDataDispenser, IID_IMetaDataDispenser, (LPVOID*)metadataDispenser.GetAddressOf());
    if (FAILED(hr))
        __cli_WinRTThrowError(hr); // internal method name subject to change post BUILD

    HSTRING hStringFileName;
    mdTypeDef typeDefToken;
    hr = RoGetMetaDataFile(hStringClassName, metadataDispenser.Get(), &hStringFileName, &metadataImport, &typeDefToken);
    if (FAILED(hr))
        __cli_WinRTThrowError(hr); // internal method name subject to change post BUILD
    String^ fileName = reinterpret_cast<String^>(hStringFileName);

    HCORENUM hCorEnum = 0;
    mdMethodDef methodDefs[2048];
    ULONG countMethodDefs = sizeof(methodDefs);
    hr = metadataImport->EnumMethods(&hCorEnum, typeDefToken, methodDefs, countMethodDefs,  &countMethodDefs);
    if (FAILED(hr))
        __cli_WinRTThrowError(hr); // internal method name subject to change post BUILD

    wchar_t methodName[1024];
    ULONG countMethodName;
    std::wstring strMethods;
    Vector<String^>^ retVal = ref new Vector<String^>();

    for (int i = 0; i < countMethodDefs; ++i)
    {
        countMethodName = sizeof(methodName);
        hr = metadataImport->GetMethodProps(methodDefs[i], nullptr, methodName, countMethodName, &countMethodName, nullptr, nullptr, nullptr, nullptr, nullptr);
        if (SUCCEEDED(hr))
        {
            methodName[ countMethodName ] = 0;
            retVal->Append(ref new String(methodName));
        }
    }
    return retVal;
}

Viz také

Spolupráce s jinými jazyky