【问题标题】:Unable to import MFCreateDXSurfaceBuffer function无法导入 MFCreateDXSurfaceBuffer 函数
【发布时间】:2013-10-04 03:02:56
【问题描述】:

我正在开发一些视频编辑软件,需要使用一些 Direct3D 组件来提高性能。具体来说,我需要使用MFCreateDXSurfaceBuffer 函数从direct3d 表面创建样本。添加代码以使用此功能后,我在尝试运行已编译的可执行文件时收到以下消息:

在动态链接库 MFPlat.dll 中找不到过程入口点 MFCreateDXSurfaceBuffer

输出窗口:程序“[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”添加到属性->链接器->输入附加依赖项

我正在使用:

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

我尝试过的:

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

    “由于隐式依赖模块中缺少导出函数,至少有一个模块存在未解析的导入。”

    很明显,没有导入的函数是MFCreateDXSurfaceBuffer。 您可能已经注意到 MFCreateDXSurfaceBuffer 定义为 EVR.dll,我的依赖列表中明显没有。

    为什么函数导入失败,如何解决?

    【问题讨论】:

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


      【解决方案1】:

      遇到这个问题后,我搜索了Windows SDK目录下的库文件,找到了一个导出MFCreateDXSurfaceBuffer函数的.lib文件。该文件称为 evr_vista.lib。

      我不知道为什么 EVR 函数被拆分为 evr.lib 和 evr_vista.lib。

      除了“evr.lib”之外,将“evr_vista.lib”添加到要链接的库列表中应该可以解决任何链接错误。

      在 Visual Studio 下:

      项目属性 > 配置属性 > 链接器 > 输入 > 附加依赖项

      【讨论】:

        【解决方案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)

        我尝试了几件事,但都失败了。我知道这有点硬核,但至少它有效,我只为这种方法这样做,所以我想没关系。

        【讨论】:

          【解决方案3】:

          在动态链接库 MFPlat.dll 中找不到过程入口点 MFCreateDXSurfaceBuffer

          MFCreateDXSurfaceBuffer 函数从evr.dll 导出,而不是mfplat.dll - 你已经发现了这一点。我想您可能使用了一些错误/损坏的 Windows SDK 版本。至少在 Windows SDK 7.0 中,代码构建和启动都很好。除了上面引用的代码 sn-p 之外,您只需添加 evr.lib 作为附加的链接器输入。

          【讨论】:

          • 尝试指向不同的 SDK 版本,然后下载 SDK 的新副本,但仍然没有成功。此外,我的代码不只与链接器指令中的 evr.lib 链接,而是只与 mfplat.lib 链接。
          • 应该还是SDK的问题。我检查了您的代码并将其与evr.lib 链接。该二进制文件没有 mfplat.dll 依赖项并链接到 evr.dll 的导出。
          猜你喜欢
          • 1970-01-01
          • 2019-12-11
          • 2021-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多