How to Obtain the Data Pointer From the IMemoryBufferReference (C# & C++)

The IMemoryBufferReference interface allows a client to retrieve the Capacity of the memory buffer. The same object identity must also implement the COM interface IMemoryBufferByteAccess. A client retrieves the IMemoryBufferByteAccess interface pointer via a QueryInterface from the IMemoryBufferReference object.

To access a the data pointer in IMemoryBufferReference, we first need to get the pointer to IMemoryBufferByteAccess interface.

In C#, it will be very simple.

#1 Declare the COM interface

 [ComImport]

[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

unsafe interface IMemoryBufferByteAccess

{

  void GetBuffer(out byte* buffer, out uint capacity);

}
 
#2 Get the underlying interface
 if (reference is IMemoryBufferByteAccess)

{

  // Get a pointer to the pixel buffer

  byte* data;

  uint capacity;

 

  ((IMemoryBufferByteAccess)reference).GetBuffer(out data, out capacity);

  ********

}

CLR will handle the underlying things to get the IMemoryBufferByteAccess interface from reference object.

In C++, you may need to do all of these by yourself.

#1 Declare the COM interface

 MIDL_INTERFACE("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")

IMemoryBufferByteAccess : IUnknown

{

       virtual HRESULT STDMETHODCALLTYPE GetBuffer(

              BYTE   **value,

              UINT32 *capacity

              );

};

#2 Get the underlying interface

 ComPtr<IMemoryBufferByteAccess> bufferByteAccess;

HRESULT result = reinterpret_cast<IInspectable*>(reference)->QueryInterface(IID_PPV_ARGS(&bufferByteAccess));

if (result == S_OK)

{

  WriteLine("Get interface successfully");

  BYTE* data = nullptr;

  UINT32 capacity = 0;

  result = bufferByteAccess->GetBuffer(&data, &capacity);

  if (result == S_OK)

  {

    WriteLine("get data access successfully, capacity: " + capacity);

  }

}