【问题标题】:Get a ComPtr<IStream> from a IBuffer从 IBuffer 获取 ComPtr<IStream>
【发布时间】:2016-01-13 22:12:56
【问题描述】:

我正在努力连接两个 API。从一个我得到一个Windows::Storage::IBuffer,另一个要求一个ComPtr&lt;IStream&gt;.,即使我想复制流中的数据,我似乎也找不到连接这两者的方法。

到目前为止,从 IBuffer 向前推进的唯一方法是创建一个 Windows::Storage::Streams::DataReader::FromBuffer(buffer). 从那里,我可以通过 ReadBytes 获取 Platform::Array&lt;unsigned char&gt; 数组,但是接下来呢?

谢谢!

【问题讨论】:

  • 假设这是旧的COM IStream,不是很清楚,您需要编写一个实现该接口的类。您可以为大多数 IStream 方法返回 E_NOTIMPL,您需要 QI、AddRef、Release、Read 和(可能)Stat。 Read 方法实现可以使用 DataReader 进行读取。

标签: c++ windows com std uwp


【解决方案1】:

可能还有其他方法可以为 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2014-04-11
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多