2

WRLを使用してwinrtコンポーネントを作成する場合、問題は、名前空間しか使用できず、WRLで名前空間をABI::Windows::xxx使用できないことWindows::UI::Xaml::Media::Imagingです。

次に、組み込みのwinrtコンポーネントを戻り値として作成するにはどうすればよいですか?

// 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);
    }
}
4

1 に答える 1

8

名前空間には2つのセットがあります。

  • グローバル名前空間に根ざしたもの(例Windows::Foundation
  • ABI名前空間に根ざしたもの(例ABI::Windows::Foundation

それぞれの内容は「同じ」です。たとえばWindows::Foundation::IUriRuntimeClass、と同じインターフェイスに名前を付けますABI::Windows::Foundation::IUriRuntimeClass

では、なぜ2セットの名前空間があるのでしょうか。グローバル名前空間をルートとする名前空間は、C ++/CXで使用するために予約されています。これらの名前空間でランタイムクラスのプロジェクションを生成します。WRLを使用している場合は、常に名前空間をルートとする名前空間を使用しABIます(これは「投影されていない」名前です。つまり、ABIレイヤーに存在する名前とまったく同じです)。

ランタイムクラスは、2つの方法のいずれかでインスタンス化(「アクティブ化」)されます。タイプがデフォルトで構築可能である場合、を呼び出すことでデフォルトで構築される可能性がありますRoActivateInstance。型が他のコンストラクターを宣言している場合、それらのコンストラクターは、を呼び出してランタイム型のアクティベーションファクトリを取得することで呼び出すことができますRoGetActivationFactoryBitmapImage例として、次のようにデフォルトで作成できます。

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
}

WRLには、目的のターゲットインターフェイスをWindows::Foundation::ActivateInstance呼び出しRoActivateInstanceて実行する便利な関数テンプレートもあります。QueryInterface

using namespace Windows::Foundation;

ComPtr<IBitmapImage> bitmapImage;
if (FAILED(ActivateInstance(classId.Get(), bitmapImage.GetAddressOf())))
{
    // Handle failure
}
于 2012-10-02T17:16:16.163 に答える