سؤال

عند إنشاء مكون وينرت باستخدام ورل ، والمشكلة هي أنني يمكن أن تستخدم فقط 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
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top