几个月之前我写了一篇文章讲怎么把C++/CX的异步操作同步执行(https://hjc.im/winrt-ckai-fa-zhi-yi-bu-zhuan-tong-bu/ ),当初做这个其实最主要就是为了给ffmpeg读写文件。

不过如果只是为了读写文件,这样是个比较笨的办法,更好的办法是使用API函数CreateStreamOverRandomAccessStream直接将IRandomAccessStream转换成COM的IStream

IStream* fileStreamData;
HRESULT hr = CreateStreamOverRandomAccessStream(
    reinterpret_cast<IUnknown*>(stream), IID_PPV_ARGS(&fileStreamData));
if (!SUCCEEDED(hr)) {
...处理异常
}

得到一个IStream对象之后就可以使用它来读写流了。

例如读取:

uint8_t* buf = (uint8_t*)malloc(sizeof(uint8_t)*1024);
int bufSize = 1024;
int bytesRead = 0;
HRESULT hr = pStream->Read(buf, bufSize, &bytesRead);
if (FAILED(hr))
{
    ...
}
if (!bytesRead)
{
    ...
}
...

注意IStream用完要调用Release(),或者用ComPtr<IStream>来控制,否则会导致内存和外部资源泄漏。