Come avvolgere un buffer char * in un IBuffer WinRT in C ++

Voglio implementare un Cacker WinRT C ++ che avvolge un buffer char *, quindi posso usarlo con le operazioni WinRT WriteAsync / ReadAsync che accettano un parametro IBuffer ^.

EDIT 1 (chiarimento)

Voglio evitare la copia dei dati.

Principalmente copiati da http://jeremiahmorrill.wordpress.com/2012/05/11/http-winrt-client-for-c/ ma adattati per racchiudere direttamente il mio byte []:

NativeBuffer.h:

#pragma once #include  #include  #include  #include  #include  // todo: namespace class NativeBuffer : public Microsoft::WRL::RuntimeClass, ABI::Windows::Storage::Streams::IBuffer, Windows::Storage::Streams::IBufferByteAccess> { public: virtual ~NativeBuffer() { } STDMETHODIMP RuntimeClassInitialize(byte *buffer, UINT totalSize) { m_length = totalSize; m_buffer = buffer; return S_OK; } STDMETHODIMP Buffer(byte **value) { *value = m_buffer; return S_OK; } STDMETHODIMP get_Capacity(UINT32 *value) { *value = m_length; return S_OK; } STDMETHODIMP get_Length(UINT32 *value) { *value = m_length; return S_OK; } STDMETHODIMP put_Length(UINT32 value) { m_length = value; return S_OK; } private: UINT32 m_length; byte *m_buffer; }; 

Per creare l’IBuffer:

 Streams::IBuffer ^CreateNativeBuffer(LPVOID lpBuffer, DWORD nNumberOfBytes) { Microsoft::WRL::ComPtr nativeBuffer; Microsoft::WRL::Details::MakeAndInitialize(&nativeBuffer, (byte *)lpBuffer, nNumberOfBytes); auto iinspectable = (IInspectable *)reinterpret_cast(nativeBuffer.Get()); Streams::IBuffer ^buffer = reinterpret_cast(iinspectable); return buffer; } 

E la chiamata per leggere i dati (lpBuffer è il byte []):

 Streams::IBuffer ^buffer = CreateNativeBuffer(lpBuffer, nNumberOfbytes); create_task(randomAccessStream->ReadAsync(buffer, (unsigned int)nNumberOfBytesToRead, Streams::InputStreamOptions::None)).wait(); 

Non sono così sicuro che il ComPtr abbia bisogno di una pulizia, quindi qualsiasi suggerimento riguardante la gestione della memoria è benvenuto.

Questo dovrebbe funzionare:

 // Windows::Storage::Streams::DataWriter // Windows::Storage::Streams::IBuffer // BYTE = unsigned char (could be char too) BYTE input[1024] {}; DataWriter ^writer = ref new DataWriter(); writer->WriteBytes(Platform::ArrayReference(input, sizeof(input)); IBuffer ^buffer = writer->DetachBuffer();