MFGetService 辅助函数不支持某些服务接口

Posted

技术标签:

【中文标题】MFGetService 辅助函数不支持某些服务接口【英文标题】:Some Service interface are not supported in the MFGetService helper function 【发布时间】:2019-08-05 12:00:05 【问题描述】:

我正在尝试获取指向 IDirect3DSurface9 的指针,并使用辅助函数 MFGetService 并将 MR_BUFFER_SERVICE 传递给第二个参数。链接时,我收到“未解析的外部符号 _MR_BUFFER_SERVICE " 错误。

我在evr.h中查找了MR_BUFFER_SERVICE的定义,发现有一个宏描述它:

DEFINE_GUID(MR_BUFFER_SERVICE, 
    0xa562248c, 
    0x9ac6, 
    0x4ffc, 
    0x9f, 0xba, 0x3a, 0xf8, 0xf8, 0xad, 0x1a, 0x4d 
);

然后我决定自己制作此 GUID 并传递给 MFGetService,但随后在调试时收到错误代码 E_NOINTERFACE

//Here are the GUID struct I made:
const GUID FAR MR_BUFFER_SERVICE =  0xa562248c,0x9ac6,0x4ffc, 0x9f, 0xba, 0x3a, 0xf8, 0xf8, 0xad, 0x1a, 0x4d ;

//The main code of getting a pointer to IDirect3DSurface9:
IDirect3DSurface9 *d3dsurface9;
IMFMediaBuffer* pBuffer = NULL;
hr = MFCreateMemoryBuffer(1024 * 10, &pBuffer);
if (FAILED(hr))

    MessageBox(NULL, L"fail in creating Media Buffer", NULL, NULL);

    hr = MFGetService(pBuffer, MR_BUFFER_SERVICE, 
        IID_PPV_ARGS(&d3dsurface9));
if (FAILED(hr))

    MessageBox(NULL, L"failed in getting IDirect3DSurface9", NULL, NULL);

【问题讨论】:

【参考方案1】:
    链接器错误将通过额外链接strmiids.lib来解决
#pragma comment(lib, "strmiids.lib")
    MR_BUFFER_SERVICE 不适用于您由 MFCreateMemoryBuffer 创建的通用系统内存支持缓冲区。此服务仅可从包装相应 D3D9 表面的缓冲区获得,尤其是。使用MFCreateDXSurfaceBuffer 函数创建。

详细信息记录在这里:DirectX Surface Buffer。

【讨论】:

以上是关于MFGetService 辅助函数不支持某些服务接口的主要内容,如果未能解决你的问题,请参考以下文章

在某些列表上链接函数调用

Kotlin二级构造函数

vigenere cipher 的 C++ 函数仅有时有效(适用于某些输入,跳过其他输入)

CI框架 -- 自动加载资源

Laravel 常用辅助函数

电脑登不上百度和某些网站 显示http501未执行/不支持http505版本_(qq和某些网页能打开)