2015-10-15 48 views
1

我很努力地連接兩個API。從一個我得到一個Windows::Storage::IBuffer,另一個需要一個ComPtr<IStream>.我似乎沒有找到一種方法橋接這兩個,即使我想做一個數據流的副本。從IBuffer獲取ComPtr <IStream>

到目前爲止從IBuffer轉發的唯一途徑就是創建一個Windows::Storage::Streams::DataReader::FromBuffer(buffer).從那裏我可以得到Platform::Array<unsigned char>數組,但那又如何?

謝謝!

+0

假設這是從前的COM的IStream,這是不是很清楚,你需要編寫一個實現接口的類。您可以返回大多數IStream方法的E_NOTIMPL,您需要QI,AddRef,Release,Read和(可能)Stat。 Read方法的實現可以使用DataReader來進行讀取。 –

回答

0

可能還有其他方法可以獲得與IBuffer兼容的COM接口IStream,但是如果具有數據字節,則可以使用CreateStreamOnHGlobal API在內存中創建COM IStream,然後將這些字節複製到新的IStream中。在交出之前不要忘記重置尋道指針。

[DllImport("ole32.dll")] 
private static extern int CreateStreamOnHGlobal(IntPtr hGlobal, bool fDeleteOnRelease, out IStream ppstm); 

System.Runtime.InteropServices.ComTypes stm; 
if (CreateStreamOnHGlobal(IntPtr.Zero, true, out stm) == 0) 
{ 
    stm.Write(...data for the stream...); 

    stm.Seek(0, 0, IntPtr.Zero); // seek to start of stream 
}