Как в проекте CppWinRT преобразовать указатель byte* к интерфейсу IBuffer

Я использую компонент с++ dll с использованием пакета Microsoft.Windows.CppWinRT, в котором хочу выполнить преобразование byte* к Windows::Storage::Streams::IBuffer без излишней "аллокаци и копирования". За основу я взял NativeBuffer из поста

В частности, использую следующий код:

MediaStreamSample SimpleMath::MakeMediaStreamSample(IMemoryBufferReference bufferReference, unsigned int nNumberOfBytes, TimeSpan timestamp, TimeSpan duration)
{
    auto memoryBufferByteAccess = 
        bufferReference.as<IMemoryBufferByteAccess>();

    BYTE* data;
    UINT32 capacity;
    memoryBufferByteAccess->GetBuffer(&data, &capacity);

    Microsoft::WRL::ComPtr<NativeBuffer> nativeBuffer;
    Microsoft::WRL::Details::MakeAndInitialize<NativeBuffer>(&nativeBuffer, (byte*)data, nNumberOfBytes);

    // origin in WRL
    //Windows::Storage::Streams::IBuffer^ buffer = reinterpret_cast<Windows::Storage::Streams::IBuffer^>(nativeBuffer.Get());

    // variant1 
    // error C2440: reinterpret_cast: невозможно преобразовать "winrt::implements<D,winrt::SimpleMathComponent::SimpleMath>::IInspectable *" в "winrt::Windows::Storage::Streams::IBuffer"
    auto iinspectable = (IInspectable*)reinterpret_cast<IInspectable*>(nativeBuffer.Get());
    auto buffer = reinterpret_cast<Windows::Storage::Streams::IBuffer>(iinspectable);

    auto mediaStreamSample =
        MediaStreamSample::CreateFromBuffer(buffer, timestamp);

    mediaStreamSample.Duration(duration);

    return
        mediaStreamSample;
}

Это приводит к ошибке компиляции

error C2440: reinterpret_cast: невозможно преобразовать "winrt::implements<D,winrt::SimpleMathComponent::SimpleMath>::IInspectable *" в "winrt::Windows::Storage::Streams::IBuffer"


Ответы (2 шт):

Автор решения: user7860670

В этой ситуации необходимо создавать новый буфер в памяти и копировать содержимое в него, например вызывая Windows::Storage::Streams::Buffer::CreateCopyFromMemoryBuffer, как бы этого не хотелось. Это необходимо сделать, так как иначе NativeBuffer будет содержать указатель, с временем жизни блока памяти, на который тот указывает, не привязанным к счетчику ссылок данного объекта.

→ Ссылка
Автор решения: dex

После различных изысканий я остановился на следующем варианте:

MediaStreamSample MakeMediaStreamSample(IMemoryBufferReference bufferReference, unsigned int nNumberOfBytes, TimeSpan timestamp, TimeSpan duration)
{
    auto memoryBufferByteAccess =
        bufferReference.as<IMemoryBufferByteAccess>();

    BYTE* data;
    UINT32 capacity;
    memoryBufferByteAccess->GetBuffer(&data, &capacity);

    Microsoft::WRL::ComPtr<NativeBuffer> nativeBuffer;
    Microsoft::WRL::Details::MakeAndInitialize<NativeBuffer>(&nativeBuffer, (byte*)data, nNumberOfBytes);

    // origin in WRL
    //Windows::Storage::Streams::IBuffer^ buffer = reinterpret_cast<Windows::Storage::Streams::IBuffer^>(nativeBuffer.Get());

    auto buffer = 
        winrt::impl::wrap_as_result<IBuffer>(nativeBuffer.Get());

    auto mediaStreamSample =
        MediaStreamSample::CreateFromBuffer(buffer, timestamp);

    mediaStreamSample.Duration(duration);

    return
        mediaStreamSample;
}
→ Ссылка