كيفية إرجاع مكون وينرت بناء في استخدام ورل?
-
12-12-2019 - |
سؤال
عند إنشاء مكون وينرت باستخدام ورل ، والمشكلة هي أنني يمكن أن تستخدم فقط ABI::Windows::xxx
مساحة الاسم ، ولا يمكنني استخدامها Windows::UI::Xaml::Media::Imaging
مساحة الاسم في ور.
ثم, كيفية إنشاء مكون وينرت البناء في كقيمة الإرجاع?
// idl
import "inspectable.idl";
import "Windows.Foundation.idl";
import "Windows.UI.Xaml.Media.Imaging.idl";
namespace Decoder
{
interface IPhotoDecoder;
runtimeclass PhotoDecoder;
interface IPhotoDecoder : IInspectable
{
HRESULT Decode([in] int width, [in] int height, [out, retval] Windows.UI.Xaml.Media.Imaging.BitmapImage **ppBitmapImage);
}
[version(COMPONENT_VERSION), activatable(COMPONENT_VERSION)]
runtimeclass PhotoDecoder
{
[default] interface IPhotoDecoder;
}
}
// cpp
using namespace Microsoft::WRL;
using namespace Windows::Foundation;
using namespace ABI::Windows::UI::Xaml::Media::Imaging;
namespace ABI
{
namespace Decoder
{
class PhotoDecoder: public RuntimeClass<IPhotoDecoder>
{
InspectableClass(L"Decoder.PhotoDecoder", BaseTrust)
public:
PhotoDecoder()
{
}
HRESULT __stdcall Decode(_In_ int width, _In_ int height, _Out_ IBitmapImage **ppBitmapImage)
{
// How to create Windows.UI.Xaml.Media.Imaging.BitmapImage without using Windows::UI::Xaml::Media::Imaging
}
};
ActivatableClass(PhotoDecoder);
}
}
المحلول
هناك مجموعتان من مساحات الأسماء:
- تلك الجذور في مساحة الاسم العالمية (على سبيل المثال.
Windows::Foundation
) - تلك الجذور في
ABI
مساحة الاسم (على سبيل المثال.ABI::Windows::Foundation
)
محتويات كل منها هي " نفسها."على سبيل المثال, Windows::Foundation::IUriRuntimeClass
أسماء نفس الواجهة مثل ABI::Windows::Foundation::IUriRuntimeClass
.
وبالتالي, لماذا توجد مجموعتان من مساحات الأسماء?يتم حجز مساحات الأسماء المتجذرة في مساحة الاسم العالمية للاستخدام من قبل سي++ / سك:يقوم بإنشاء توقعاته لفئات وقت التشغيل في مساحات الأسماء هذه.عندما كنت تستخدم ور ، عليك أن تعمل دائما مع مساحات الأسماء الجذور في ABI
مساحة الاسم (وهي أسماء" غير مرغوبة " ، أي أنها موجودة بالضبط في طبقة أبي).
يتم إنشاء مثيل لفئات وقت التشغيل ("تنشيط") بإحدى طريقتين.إذا كان النوع قابل للإنشاء افتراضيا ، فقد يتم إنشاؤه افتراضيا عن طريق الاتصال RoActivateInstance
.إذا أعلن أحد الأنواع منشئات أخرى ، فقد يتم استدعاء هؤلاء المنشئين عن طريق الحصول على مصنع التنشيط لنوع وقت التشغيل عن طريق الاتصال RoGetActivationFactory
.على سبيل المثال ، يمكنك إنشاء ملف افتراضي BitmapImage
مثل ذلك:
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
using namespace ABI::Windows::UI::Xaml::Media::Imaging;
HStringReference classId(RuntimeClass_Windows_UI_Xaml_Media_Imaging_BitmapImage);
ComPtr<IInspectable> inspectable;
if (FAILED(RoActivateInstance(classId.Get(), inspectable.GetAddressOf())))
{
// Handle failure
}
ComPtr<IBitmapImage> bitmapImage;
if (FAILED(inspectable.As(&bitmapImage)))
{
// Handle failure
}
يحتوي ور أيضا قالب وظيفة مفيدة, Windows::Foundation::ActivateInstance
, ، أن كلا المكالمات RoActivateInstance
وينفذ QueryInterface
إلى واجهة الهدف المطلوب:
using namespace Windows::Foundation;
ComPtr<IBitmapImage> bitmapImage;
if (FAILED(ActivateInstance(classId.Get(), bitmapImage.GetAddressOf())))
{
// Handle failure
}