0x88982F50: "Компонент не найден" при использовании DirectWTK CreateWICTextureFromMemory()

Я работаю над (Universal Windows) C++/cx Directx проектом, который собирает в dll, используемую в проекте aC# UWP.

Я использую DirectX Toolkit для загрузки текстур.

Я уже использовал его для создания текстуры из файла, но теперь мне нужно создать текстуру из байтового массива, который был отправлен из проекта UWP. Но при попытке использовать CreateWICTextureFromMemory() HRESULT говорит 0x88982F50:"Компонент не найден"

Все, что я могу найти об этой проблеме, указывает на то, что байты не являются правильным изображением, но я проверил его в проекте UWP, там я получил байтовый массив из bingmaps (это статическое изображение карты), и я мог бы создать из них рабочее изображение. байт.

Кто-нибудь знает, что я делаю не так?

UWP C# скачать код (чтобы получить байты):

private async Task DownloadTexture()
    {
        byte[] buffer = null;
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
            WebResponse response = await request.GetResponseAsync();
            using (Stream stream = response.GetResponseStream())
            using (MemoryStream ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                buffer = ms.ToArray();
            }
        }
        catch (Exception exception)
        {
            Logger.Error($"Could not Download Texture: {exception}");
        }

        _track3D.SetImage(out buffer[0], (ulong)buffer.Length);
    }

Код Directx C++ (который не работает):

void Track3D::SetImage(uint8_t* ddsData, size_t ddsDataSize)
{
    HRESULT result = CreateWICTextureFromMemory(_d3dDevice.Get(), _d3dContext.Get(), ddsData, ddsDataSize, nullptr, _Terrain.ReleaseAndGetAddressOf());
    //here it goes wrong
    //TODO: use the texture
}

Тестовый код UWP C#, который работает (отображает изображение):

private async void setImage(byte[] buffer) //test
    {
        try
        {
            BitmapImage bmpImage = new BitmapImage();
            using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
            {
                await stream.WriteAsync(buffer.AsBuffer());
                stream.Seek(0);
                await bmpImage.SetSourceAsync(stream);
            }

            Image image = new Image();
            image.Source = bmpImage;

            ((Grid)Content).Children.Add(image);
        }
        catch (Exception exception)
        {
            Logger.Error($"{exception}");
        }
    }

РЕДАКТИРОВАТЬ:

Хорошо, оказывается, что первый байт в буфере отличается в коде C++, чем это было при отправке из UWP. Когда я изменяю этот первый байт на правильное значение в коде C++ (в качестве теста), текстура создается правильно.

Возникает вопрос: почему изменилось значение первого байта? (Или что я сделал не так?)

В соответствии с запросом функция setImage() выглядит так в C#:

[MethodImpl]
public void __ITrack3DPublicNonVirtuals.SetImage(out byte ddsData, [In] ulong ddsDataSize);

(Кроме того, я только что понял, что имена параметров по-прежнему имеют "dds" в их имени, извините за это, изменит это в моем коде, поскольку это вводит в заблуждение)

1 ответ

0x88982F50: "Компонент не найден"

Это WINCODEC_ERR_COMPONENTNOTFOUND что происходит всякий раз, когда WIC не может определить, какой формат кодека использовать для файла / двоичного файла. Ваша проблема заключается в неправильной передаче данных из управляемого в собственный код.

Ваш метод взаимодействия настроен на:

[MethodImpl]
public void __ITrack3DPublicNonVirtuals.SetImage(out byte ddsData, [In] ulong ddsDataSize);

С сигнатурой метода C++:

void Track3D::SetImage(uint8_t* ddsData, size_t ddsDataSize)

Из-за out Ваш первый параметр передается как безопасный массив с длиной в первом элементе.

Вместо этого вы должны использовать:

SetImage([In] byte ddsData, [In] ulong ddsDataSize); // C#

void Track3D::SetImage(const uint8_t* ddsData, size_t ddsDataSize); // C++.
Другие вопросы по тегам