Невозможно импортировать функцию MFCreateDXSurfaceBuffer

Я работаю над некоторым программным обеспечением для редактирования видео, и мне нужно использовать некоторые компоненты Direct3D для повышения производительности. В частности, мне нужно использовать MFCreateDXSurfaceBuffer функция для создания образцов с Direct3D поверхности. После добавления кода для использования этой функции я получаю следующее сообщение при попытке запустить скомпилированный исполняемый файл:

Не удалось найти точку входа процедуры MFCreateDXSurfaceBuffer в библиотеке динамических ссылок MFPlat.dll.

Окно вывода: Программа «[0x1C04] ClassLibrary1.exe: собственный» завершила работу с кодом -1073741511 (0xc0000139) «Точка входа не найдена».

Я создал минималистичный проект, который воспроизводит проблему:

#include < mfapi.h >
#include < d3d9.h >
#include < evr.h >

static void
Fail
(
)
{
IDirect3DSurface9* theSurface = nullptr;
IMFMediaBuffer* theBuffer = nullptr;
MFCreateDXSurfaceBuffer(__uuidof(IDirect3DSurface9), theSurface, FALSE, &theBuffer);
}

int main()
{
Fail();
}

Я добавил «evr.lib; mfplat.lib; D3d9.lib» в Свойства-> Линкер-> Ввод Дополнительные зависимости

Я использую:

  • Windows 7 64 бит
  • MS Visual Studio 2012
  • C ++

Что я пробовал:

  • Google — нет упоминания о подобной проблеме
  • Запустил код на машине сотрудника. Та же проблема возникает.
  • Вызовите другие функции из evr.dll. У некоторых работа, у некоторых такая же проблема
  • Ходок за зависимостями: мини-проект EXE Зависит от MFPLAT.DLL, MSVCR110D.DLL и KERNEL32.DLL.
  • Сообщение об ошибке:

    «По крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в неявно зависимом модуле».

    Очевидно, что функция, которая не импортировала, была MFCreateDXSurfaceBuffer.
    Возможно, вы заметили, что MFCreateDXSurfaceBuffer определяется EVR.dll, который явно отсутствует в моем списке зависимостей.

    Почему не удается импортировать функцию и как ее исправить?

    3

    Решение

    Не удалось найти точку входа процедуры MFCreateDXSurfaceBuffer в библиотеке динамических ссылок MFPlat.dll.

    MFCreateDXSurfaceBuffer функция экспортируется evr.dllне mfplat.dll — Вы уже обнаружили это. Я полагаю, вы можете использовать неправильную / поврежденную версию Windows SDK. По крайней мере, в Windows SDK 7.0 код собирается и запускается нормально. Помимо приведенного выше фрагмента кода, вам нужно только добавить evr.lib в качестве дополнительного входа компоновщика.

    2

    Другие решения

    Я тоже сталкиваюсь с этой проблемой.
    Для протокола, я пишу решение, которое я нашел здесь:

    HMODULE evrModule = LoadLibraryA("evr.dll");
    
    /* MFCreateDXSurfaceBuffer prototype */
    typedef HRESULT(STDAPICALLTYPE *MFCDXSB)(_In_ REFIID iid, _In_ IUnknown *unkSurface, _In_ BOOL bottomUpWhenLinera, _Out_ IMFMediaBuffer **mediaBuffer);
    
    MFCDXSB pMFCreateDXSurfaceBuffer = (MFCDXSB)GetProcAddress(evrModule, "MFCreateDXSurfaceBuffer");
    

    Не забудьте проверить на наличие ошибок и вызвать FreeLibrary (evrModule) в конце

    Я попробовал несколько вещей, и все они потерпели неудачу. Я знаю, что это немного хардкор, но по крайней мере это работает, и я делаю это только для этого метода, так что я думаю, что все в порядке.

    2

    Столкнувшись с этой проблемой, я искал библиотечные файлы в каталоге Windows SDK и нашел .lib-файл, который экспортирует функцию MFCreateDXSurfaceBuffer. Файл называется evr_vista.lib.

    Я понятия не имею, почему функции EVR были разделены на evr.lib и evr_vista.lib.

    Добавление «evr_vista.lib» в дополнение к «evr.lib» в список библиотек, с которыми нужно связать, должно устранить любые ошибки компоновки.

    Под Visual Studio:

    Свойства проекта> Свойства конфигурации> Линкер> Ввод> Дополнительные зависимости

    0
    По вопросам рекламы [email protected]