virtual ComPtr<CanvasSwapChainPanel> CreateCanvasSwapChainPanel() override
    {
        ComPtr<IInspectable> canvasSwapChainPanelInspectable;
        ThrowIfFailed(m_canvasSwapChainPanelActivationFactory->ActivateInstance(&canvasSwapChainPanelInspectable));

        auto canvasSwapChainPanel = As<ICanvasSwapChainPanel>(canvasSwapChainPanelInspectable);

        return static_cast<CanvasSwapChainPanel*>(canvasSwapChainPanel.Get());
    }
    virtual ComPtr<IImage> CreateImageControl() override 
    {
        ComPtr<IInspectable> inspectableImage;
        ThrowIfFailed(m_imageControlFactory->ActivateInstance(&inspectableImage));

        ComPtr<IImage> image;
        ThrowIfFailed(inspectableImage.As(&image));

        return image;
    }
HRESULT Trace::CreateLoggingFields(ComPtr<ILoggingFields> *ppFields)
{
	HRESULT hr = S_OK;
	HStringReference runtimeClassLoggingFields(RuntimeClass_Windows_Foundation_Diagnostics_LoggingFields);
	ComPtr<IActivationFactory> spFactory;
	hr = ABI::Windows::Foundation::GetActivationFactory(runtimeClassLoggingFields.Get(), &spFactory);
	if (FAILED(hr))
		return hr;
	ComPtr<IInspectable> object;
	spFactory->ActivateInstance(&object);
	
	hr = object.As(ppFields);
	return hr;
}
bool WinRTWindow::initialize(const std::string &name, size_t width, size_t height)
{
    ComPtr<ICoreWindowStatic> coreWindowStatic;
    ComPtr<IActivationFactory> propertySetFactory;
    ComPtr<IPropertyValueStatics> propertyValueStatics;

    ComPtr<ICoreApplication> coreApplication;
    ComPtr<IPropertySet> coreApplicationProperties;
    ComPtr<IMap<HSTRING, IInspectable *>> coreApplicationPropertiesAsMap;

    ComPtr<IMap<HSTRING, IInspectable *>> nativeWindowAsMap;
    ComPtr<IInspectable> sizeValue;

    HRESULT result           = S_OK;
    boolean propertyReplaced = false;

    destroy();

    // Get all the relevant activation factories
    result = GetActivationFactory(
        HStringReference(RuntimeClass_Windows_UI_Core_CoreWindow).Get(), &coreWindowStatic);
    if (FAILED(result))
    {
        return false;
    }

    result = GetActivationFactory(
        HStringReference(RuntimeClass_Windows_Foundation_Collections_PropertySet).Get(),
        &propertySetFactory);
    if (FAILED(result))
    {
        return false;
    }

    result =
        GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_PropertyValue).Get(),
                             &propertyValueStatics);
    if (FAILED(result))
    {
        return false;
    }

    result = GetActivationFactory(
        HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(),
        &coreApplication);
    if (FAILED(result))
    {
        return false;
    }

    // Create a PropertySet to be used as the native window
    result = propertySetFactory->ActivateInstance(&mNativeWindow);
    if (FAILED(result))
    {
        return false;
    }

    // Get the PropertySet as a map, so we can Insert things into it later
    ComPtr<IInspectable> tempNativeWindow = mNativeWindow;
    result = tempNativeWindow.As(&nativeWindowAsMap);
    if (FAILED(result))
    {
        return false;
    }

    // Get the CoreApplication properties
    result = coreApplication->get_Properties(coreApplicationProperties.GetAddressOf());
    if (FAILED(result))
    {
        return false;
    }

    // Get the CoreApplication properties as a map
    result = coreApplicationProperties.As(&coreApplicationPropertiesAsMap);
    if (FAILED(result))
    {
        return false;
    }

    // See if the application properties contain an EGLNativeWindowTypeProperty
    boolean hasEGLNativeWindowTypeProperty;
    result = coreApplicationPropertiesAsMap->HasKey(
        HStringReference(EGLNativeWindowTypeProperty).Get(), &hasEGLNativeWindowTypeProperty);
    if (FAILED(result))
    {
        return false;
    }

    // If an EGLNativeWindowTypeProperty is inputted then use it
    if (hasEGLNativeWindowTypeProperty)
    {
        ComPtr<IInspectable> coreApplicationPropertyNativeWindow;

        result = coreApplicationPropertiesAsMap->Lookup(
            HStringReference(EGLNativeWindowTypeProperty).Get(),
            &coreApplicationPropertyNativeWindow);
        if (FAILED(result))
        {
            return false;
        }

        // See if the inputted window was a CoreWindow
        ComPtr<ICoreWindow> applicationPropertyCoreWindow;
        if (SUCCEEDED(coreApplicationPropertyNativeWindow.As(&applicationPropertyCoreWindow)))
        {
            // Store away the CoreWindow's dispatcher, to be used later to process messages
            result = applicationPropertyCoreWindow->get_Dispatcher(&mCoreDispatcher);
            if (FAILED(result))
            {
                return false;
            }
        }
        else
        {
            ComPtr<IPropertySet> propSet;

            // Disallow Property Sets here, since we want to wrap this window in
            // a property set with the size property below
            if (SUCCEEDED(coreApplicationPropertyNativeWindow.As(&propSet)))
            {
                return false;
            }
        }

        // Add the window to the map
        result =
            nativeWindowAsMap->Insert(HStringReference(EGLNativeWindowTypeProperty).Get(),
                                      coreApplicationPropertyNativeWindow.Get(), &propertyReplaced);
        if (FAILED(result))
        {
            return false;
        }
    }
    else
    {
        ComPtr<ICoreWindow> currentThreadCoreWindow;

        // Get the CoreWindow for the current thread
        result = coreWindowStatic->GetForCurrentThread(&currentThreadCoreWindow);
        if (FAILED(result))
        {
            return false;
        }

        // By default, just add this thread's CoreWindow to the PropertySet
        result = nativeWindowAsMap->Insert(HStringReference(EGLNativeWindowTypeProperty).Get(),
                                           currentThreadCoreWindow.Get(), &propertyReplaced);
        if (FAILED(result))
        {
            return false;
        }

        // Store away the CoreWindow's dispatcher, to be used later to process messages
        result = currentThreadCoreWindow->get_Dispatcher(&mCoreDispatcher);
        if (FAILED(result))
        {
            return false;
        }
    }

    // Create a Size to represent the Native Window's size
    Size renderSize;
    renderSize.Width  = static_cast<float>(width);
    renderSize.Height = static_cast<float>(height);
    result = propertyValueStatics->CreateSize(renderSize, sizeValue.GetAddressOf());
    if (FAILED(result))
    {
        return false;
    }

    // Add the Size to the PropertySet
    result = nativeWindowAsMap->Insert(HStringReference(EGLRenderSurfaceSizeProperty).Get(),
                                       sizeValue.Get(), &propertyReplaced);
    if (FAILED(result))
    {
        return false;
    }

    return true;
};