سؤال

وأنا أحاول لإنشاء فئة التي تطبق الواجهة 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: لم يتم حلها رمز الخارجية "العامة: الظاهري   __stdcall طويلة Vmr9Presenter :: QueryInterface (البنية _GUID CONST و، الفراغ   * *) "(؟ QueryInterface @ Vmr9PresenterUAGJABU_GUID PAPAX @ Z) Vmr9Presenter.obj VmrPresenter

وهذا يقودني إلى الاعتقاد بأن شيئا ما لم يتم الحصول على سحبها في. أي اقتراحات بشأن كيفية التخلص من هذا الخطأ؟

هل كانت مفيدة؟

المحلول

جميع I * واجهات ليست سوى ذلك - تعريفات واجهة. واجهة هي فئة قاعدة افتراضية خالصة من حيث C ++.

وعندما تقول:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9

وتقوله "الطبقة Vmr9Presenter تنفذ هذه الواجهات". كنت تقول أيضا "إن الطبقة Vmr9Presenter مستمد من فئتين قاعدة افتراضية نقية اسمه IVMRImagePresenter9 وIVMRSurfaceAllocator9. من جانب الاتفاقية كافة الواجهات مستمدة من فئة أساسية افتراضية نقية يسمى IUnknown.

وهذا يعني أنك بحاجة إلى تنفيذ جميع الأساليب في الفئات الأساسية الافتراضية نقية في وجوه الخاص بك. لذلك تحتاج إلى تنفيذ جميع الأساليب على IVMRImagePresenter9 وIVMRSurfaceAllocator9. تحتاج أيضا إلى تنفيذ جميع الأساليب على من الفئات الأساسية، بما في ذلك IUnknown.

وIUnknown لديه 3 طرق: AddRef الإصدار و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;
    }
}

نصائح أخرى

هل أي من IVMRImagePresenter9، IVMRSurfaceAllocator9 تنفيذ بالفعل IUnknown؟ ربما تحتاج:

class Vmr9Presenter : IVMRImagePresenter9, IVMRSurfaceAllocator9, IUnknown

وأود أن أعتقد أنك قد تحتاج أيضا إلى تنفيذ AddRef () وبيان () أيضا وفقا لفي مستندات للIUnknown.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top