Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
WRL kodunu Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL) koduyla serbestçe karıştırabilirsiniz. Aynı çeviri ünitesinde WRL tanıtıcıdan nesneye () gösterimi ve WRL akıllı işaretçisi (^ComPtr<T>) gösterimiyle bildirilen nesneleri kullanabilirsiniz. Ancak, dönüş değerlerini ve WRL HRESULT hata kodlarını ve WRL özel durumlarını el ile işlemeniz gerekir.
WRL geliştirme
WRL bileşenlerini yazma ve kullanma hakkında daha fazla bilgi için bkz. Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL).
Örnek
Aşağıdaki kod parçacığı, Windows Çalışma Zamanı sınıflarını kullanmak ve meta veri dosyasını incelemek için WRL ve WRL kullanmayı gösterir.
Örnek, Microsoft Store uygulamaları oluşturma forumunda bir kod parçacığından alınmıştır. Bu kod parçacığının yazarı aşağıdaki yasal uyarıları ve ipuçlarını sunar:
C++ Windows Çalışma Zamanı türlerine yansıtacak belirli API'ler sağlamaz, ancak bir tür için Windows meta veri dosyaları (.winmd) CLR meta veri dosyalarıyla tam olarak uyumludur. Windows, belirli bir tür için .winmd dosyasına ulaşmak için yeni meta veri bulma API'lerini (RoGetMetaDataFile) sağlar. Ancak, bir sınıfın örneğini oluşturamadığınız için bu API'ler C++ geliştiricileri tarafından sınırlı kullanımdadır.
Kod derlendiğinde Runtimeobject.lib ve Rometadata.lib'i Bağlayıcı'ya da geçirmeniz gerekir.
Bu kod parçacığı olduğu gibi gösterilir. Düzgün çalışması beklense de, büyük olasılıkla hatalar içerebilir.
#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;
}