无法导入MFCreateDXSurfaceBuffer函数

时间:2013-09-27 17:53:54

标签: c++ visual-studio-2012 dll importerror ms-media-foundation

我正在制作一些视频编辑软件,需要使用一些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;输入附加依赖项

我正在使用:

  • Windows 7 64位
  • MS Visual Studio 2012
  • C ++

我尝试过的:

  • Google - 没有提及类似的问题
  • 在同事的机器上运行代码。出现同样的问题。
  • 从evr.dll调用其他函数。一些工作,一些有同样的问题
  • Dependency Walker:迷你项目EXE取决于MFPLAT.DLL,MSVCR110D.DLL和KERNEL32.DLL。
  • 错误讯息:

      

    “由于隐式相关模块中缺少导出功能,至少有一个模块具有未解析的导入。”

    显然,未导入的功能是MFCreateDXSurfaceBuffer。 您可能已经注意到MFCreateDXSurfaceBuffer是EVR.dll定义的,在我的依赖列表中明显不存在。

    为什么函数无法导入以及如何修复它?

    3 个答案:

    答案 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;附加依赖