我正在制作一些视频编辑软件,需要使用一些Direct3D组件来提高性能。具体来说,我需要使用MFCreateDXSurfaceBuffer函数从direct3d曲面创建样本。添加代码以使用此函数后,我在尝试运行已编译的可执行文件时收到以下消息:
procdedure入口点MFCreateDXSurfaceBuffer无法位于动态链接库MFPlat.dll
输出窗口:程序'[0x1C04] ClassLibrary1.exe:Native'已退出,代码为-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”添加到Properties-&gt; Linker-&gt;输入附加依赖项
我正在使用:
我尝试过的:
错误讯息:
“由于隐式相关模块中缺少导出功能,至少有一个模块具有未解析的导入。”
显然,未导入的功能是MFCreateDXSurfaceBuffer。 您可能已经注意到MFCreateDXSurfaceBuffer是EVR.dll定义的,在我的依赖列表中明显不存在。
为什么函数无法导入以及如何修复它?
答案 0 :(得分:2)
procdedure入口点MFCreateDXSurfaceBuffer无法位于动态链接库MFPlat.dll
MFCreateDXSurfaceBuffer
功能从evr.dll
导出,而不是mfplat.dll
- 您已经发现了这一点。我想你可能正在使用一些错误/损坏的Windows SDK版本。至少在Windows SDK 7.0中,代码构建并开始正常。除了上面引用的代码片段,您只需添加evr.lib
作为附加链接器输入。
答案 1 :(得分: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 :(得分:0)
遇到此问题后,我搜索了Windows SDK目录中的库文件,找到了导出MFCreateDXSurfaceBuffer函数的.lib文件。该文件名为evr_vista.lib。
我不知道为什么EVR函数被分成了evr.lib和evr_vista.lib。
在“evr.lib”之外添加“evr_vista.lib”到要链接的库列表中,可以解决任何链接错误。
在Visual Studio下:
项目属性&gt;配置属性&gt;链接器&gt;输入&gt;附加依赖