首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现IUnknown,未解析的外部符号

实现IUnknown,未解析的外部符号
EN

Stack Overflow用户
提问于 2009-09-12 20:22:02
回答 2查看 2.5K关注 0票数 2

我正在尝试创建一个实现IUnknown接口的类。头文件中有以下代码:

代码语言:javascript
复制
#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

这让我相信有些东西并没有被牵扯进来。对于如何消除这个错误,有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-12 23:44:48

所有的I*接口都是-接口定义。在C++术语中,接口是一个纯虚拟基类。

当你说:

代码语言:javascript
复制
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9

您说的是“Vmr9Presenter类实现了这些接口”。您还会说:“Vmr9Presenter类来自两个名为IVMRImagePresenter9和IVMRSurfaceAllocator9的纯虚拟基类,按照惯例,所有接口都来自一个名为IUnknown的纯虚拟基类。

这意味着您需要在对象中的纯虚拟基类中实现所有方法。因此,您需要在IVMRImagePresenter9和IVMRSurfaceAllocator9上实现所有方法。您还需要在它们的基类上实现所有方法,包括IUnknown。

IUnknown有3种方法: AddRef、Release和QueryInterface。您报告的错误表明,链接器无法找到名为Vmr9Presenter::QueryInterface的函数。

您需要向您的类添加这样的函数,一旦您这样做,它就会正常工作。

通常,QI实现如下所示:

代码语言:javascript
复制
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;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2009-09-12 20:38:29

IVMRImagePresenter9、IVMRSurfaceAllocator9是否已经实现了IUnknown?也许你需要:

代码语言:javascript
复制
class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown

我想您可能还需要根据文档 for IUnknown来实现IUnknown()和Release()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1416041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档