在“传统” C ++中,我想将ONNX文件(供WinML使用)作为资源嵌入DLL,并将其添加到.rc文件中:IDR_NETWORK ONNX "network.onnx"
一切正常,我可以使用FindResource
,LoadResource
和LockResource
函数访问资源。
对于使用WinML加载此文件,有一种方法LearningModel::LoadFromStream
以winrt::Windows::Storage::Streams::RandomAccessStreamReference
作为参数。这似乎是从文件以外的其他网络加载网络的正确界面。
我尝试使用winrt::Windows::Storage::Streams::RandomAccessStreamReference::CreateFromUri
,但看不到如何为嵌入式资源创建URI。
我当前的解决方法是提取资源,保存到临时文件,然后使用LearningModel::LoadFromFilePath
从临时文件加载。
最好是一些示例代码,说明如何直接访问资源。
另一种方法是创建一个RandomAccessStreamReference
来访问LockResource
返回的指针。
答案 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);
此代码创建数据的副本,可能会对其进行改进。