Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Du kan fritt blanda WRL-kod med WINDOWS Runtime C++-mallbibliotekskod (WRL). I samma översättningsenhet kan du använda objekt som deklarerats med WRL-notationen handle-to-object (^) och WRL smart pekare (ComPtr<T>). Du måste dock hantera returvärden manuellt och WRL HRESULT-felkoder och WRL-undantag.
WRL-utveckling
Mer information om hur du redigerar och använder WRL-komponenter finns i Windows Runtime C++ Template Library (WRL).
Exempel
Följande kodfragment visar hur du använder WRL och WRL för att använda Windows Runtime-klasser och undersöka en metadatafil.
Exemplet är hämtat från ett kodfragment i forumet Skapa Microsoft Store-appar. Författaren till det här kodfragmentet erbjuder följande ansvarsfriskrivningar och villkor:
C++ tillhandahåller inte specifika API:er för att reflektera över Windows Runtime-typer, men Windows-metadatafiler (.winmd) för en typ är helt kompatibla med CLR-metadatafiler. Windows tillhandahåller de nya API:erna för metadataidentifiering (RoGetMetaDataFile) för att komma till .winmd-filen för en viss typ. Dessa API:er är dock av begränsad användning för C++-utvecklare eftersom du inte kan instansiera en klass.
När koden har kompilerats måste du också skicka Runtimeobject.lib och Rometadata.lib till Linker.
Det här kodfragmentet visas as-is. Även om det förväntas fungera korrekt kan det eventuellt innehålla fel.
#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;
}