Как создать RandomAccessStreamReference для доступа к ресурсу, определенному в файле .rc? - PullRequest
0 голосов
/ 08 мая 2019

Работая в «традиционном» 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, помогло бы.

1 Ответ

0 голосов
/ 29 мая 2019

Следующий пример (псевдо) кода добивается цели:

        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);

Этот код создает копию данных, которые могут быть улучшены.

...