我正在尝试创建一个实现IUnknown接口的类。头文件中有以下代码:
#pragma once
#include "stdafx.h"
#include "Unknwn.h"
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9
{
public:
Vmr9Presenter(void);
HRESULT Initialize(void);
~Vmr9Presenter(void);
STDMETHODIMP QueryInterface(const IID &riid, void **ppvObject);
}; 我已经包括了相关的uuid.lib和其他几个。但是,当我试图编译时,会得到以下错误:
错误2错误LNK2001:未解决的外部符号"public:虚拟长__stdcall void 9 VmrPresenter::QueryInterface(struct _GUID const &,void* *)“LNK2001 Vmr9Presenter.obj VmrPresenter
这让我相信有些东西并没有被牵扯进来。对于如何消除这个错误,有什么建议吗?
发布于 2009-09-12 23:44:48
所有的I*接口都是-接口定义。在C++术语中,接口是一个纯虚拟基类。
当你说:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9您说的是“Vmr9Presenter类实现了这些接口”。您还会说:“Vmr9Presenter类来自两个名为IVMRImagePresenter9和IVMRSurfaceAllocator9的纯虚拟基类,按照惯例,所有接口都来自一个名为IUnknown的纯虚拟基类。
这意味着您需要在对象中的纯虚拟基类中实现所有方法。因此,您需要在IVMRImagePresenter9和IVMRSurfaceAllocator9上实现所有方法。您还需要在它们的基类上实现所有方法,包括IUnknown。
IUnknown有3种方法: AddRef、Release和QueryInterface。您报告的错误表明,链接器无法找到名为Vmr9Presenter::QueryInterface的函数。
您需要向您的类添加这样的函数,一旦您这样做,它就会正常工作。
通常,QI实现如下所示:
HRESULT IVmr9Presenter::QueryInterface(REFIID iid, PVOID *pvInterface)
{
if (pvInterface == NULL)
{
return E_POINTER;
}
*pvInterface = NULL;
if (iid == IID_IUnknown)
{
*pvInterface = static_cast<PVOID>(static_cast<IUnknown *>(this));
return S_OK;
}
if (iid == IID_IVMRSurfaceAllocator9)
{
*pvInterface = static_cast<PVOID>(static_cast<IVMRSurfaceAllocator9*>(this));
return S_OK;
}
:
else
{
return E_NOINTERFACE;
}
}发布于 2009-09-12 20:38:29
IVMRImagePresenter9、IVMRSurfaceAllocator9是否已经实现了IUnknown?也许你需要:
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown我想您可能还需要根据文档 for IUnknown来实现IUnknown()和Release()。
https://stackoverflow.com/questions/1416041
复制相似问题