Я работаю над некоторым программным обеспечением для редактирования видео, и мне нужно использовать некоторые компоненты 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» в Свойства-> Линкер-> Ввод Дополнительные зависимости
Я использую:
Что я пробовал:
Сообщение об ошибке:
«По крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в неявно зависимом модуле».
Очевидно, что функция, которая не импортировала, была MFCreateDXSurfaceBuffer.
Возможно, вы заметили, что MFCreateDXSurfaceBuffer определяется EVR.dll, который явно отсутствует в моем списке зависимостей.
Почему не удается импортировать функцию и как ее исправить?
Не удалось найти точку входа процедуры MFCreateDXSurfaceBuffer в библиотеке динамических ссылок MFPlat.dll.
MFCreateDXSurfaceBuffer
функция экспортируется evr.dll
не mfplat.dll
— Вы уже обнаружили это. Я полагаю, вы можете использовать неправильную / поврежденную версию Windows SDK. По крайней мере, в Windows SDK 7.0 код собирается и запускается нормально. Помимо приведенного выше фрагмента кода, вам нужно только добавить evr.lib
в качестве дополнительного входа компоновщика.
Я тоже сталкиваюсь с этой проблемой.
Для протокола, я пишу решение, которое я нашел здесь:
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) в конце
Я попробовал несколько вещей, и все они потерпели неудачу. Я знаю, что это немного хардкор, но по крайней мере это работает, и я делаю это только для этого метода, так что я думаю, что все в порядке.
Столкнувшись с этой проблемой, я искал библиотечные файлы в каталоге Windows SDK и нашел .lib-файл, который экспортирует функцию MFCreateDXSurfaceBuffer. Файл называется evr_vista.lib.
Я понятия не имею, почему функции EVR были разделены на evr.lib и evr_vista.lib.
Добавление «evr_vista.lib» в дополнение к «evr.lib» в список библиотек, с которыми нужно связать, должно устранить любые ошибки компоновки.
Под Visual Studio:
Свойства проекта> Свойства конфигурации> Линкер> Ввод> Дополнительные зависимости