如何创建一个RandomAccessStreamReference来访问.rc文件中定义的资源?

时间:2019-05-08 08:17:45

标签: c++ windows-runtime resources

在“传统” C ++中,我想将ONNX文件(供WinML使用)作为资源嵌入DLL,并将其添加到.rc文件中:IDR_NETWORK ONNX "network.onnx"  一切正常,我可以使用FindResourceLoadResourceLockResource函数访问资源。

对于使用WinML加载此文件,有一种方法LearningModel::LoadFromStreamwinrt::Windows::Storage::Streams::RandomAccessStreamReference作为参数。这似乎是从文件以外的其他网络加载网络的正确界面。

我尝试使用winrt::Windows::Storage::Streams::RandomAccessStreamReference::CreateFromUri,但看不到如何为嵌入式资源创建URI。

我当前的解决方法是提取资源,保存到临时文件,然后使用LearningModel::LoadFromFilePath从临时文件加载。

最好是一些示例代码,说明如何直接访问资源。

另一种方法是创建一个RandomAccessStreamReference来访问LockResource返回的指针。

1 个答案:

答案 0 :(得分:0)

下面的示例(伪)代码可以解决问题:

        HRSRC hResource = ::FindResource(hModule, MAKEINTRESOURCE(iRessourceID), L"ONNX"))
        HGLOBAL hMem = ::LoadResource(hModule, hResource)

        const BYTE* pData = (const BYTE*)::LockResource(hMem);
        const size_t iSize = ::SizeofResource(hModule, hResource);

        using namespace Windows::Storage;
        using namespace winrt::Windows::Storage::Streams;

        InMemoryRandomAccessStream modelStream;
        DataWriter writer(modelStream);
        writer.WriteBytes(array_view<const unsigned char>(pData, pData + iSize));
        writer.StoreAsync().get();

        ::FreeResource(hMem);

        modelStream.Seek(0);

        auto modelStreamReference = RandomAccessStreamReference::CreateFromStream(modelStream);
        auto model = LearningModel::LoadFromStream(modelStreamReference);

此代码创建数据的副本,可能会对其进行改进。