Virtuelle Funktionen



  • Hi C++ler,
    ich habe eine kleine Frage zu einer bestimmten Klasse (?). Das Ding sieht so aus:

    //-------------------------------------------------------------------------
    // ICommDlgBrowser interface
    //
    //  ICommDlgBrowser interface is the interface that is provided by the new
    // common dialog window to hook and modify the behavior of IShellView.  When
    // a default view is created, it queries its parent IShellBrowser for the
    // ICommDlgBrowser interface.  If supported, it calls out to that interface
    // in several cases that need to behave differently in a dialog.
    //
    // Member functions:
    //
    //  ICommDlgBrowser::OnDefaultCommand()
    //    Called when the user double-clicks in the view or presses Enter.  The
    //   browser should return S_OK if it processed the action itself, S_FALSE
    //   to let the view perform the default action.
    //
    //  ICommDlgBrowser::OnStateChange(ULONG uChange)
    //    Called when some states in the view change.  'uChange' is one of the
    //   CDBOSC_* values.  This call is made after the state (selection, focus,
    //   etc) has changed.  There is no return value.
    //
    //  ICommDlgBrowser::IncludeObject(LPCITEMIDLIST pidl)
    //    Called when the view is enumerating objects.  'pidl' is a relative
    //   IDLIST.  The browser should return S_OK to include the object in the
    //   view, S_FALSE to hide it
    //
    //-------------------------------------------------------------------------
    
    #define CDBOSC_SETFOCUS     0x00000000
    #define CDBOSC_KILLFOCUS    0x00000001
    #define CDBOSC_SELCHANGE    0x00000002
    #define CDBOSC_RENAME       0x00000003
    
    #undef  INTERFACE
    #define INTERFACE   ICommDlgBrowser
    
    DECLARE_INTERFACE_(ICommDlgBrowser, IUnknown)
    {
        // *** IUnknown methods ***
        STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
        STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
        STDMETHOD_(ULONG,Release) (THIS) PURE;
    
        // *** ICommDlgBrowser methods ***
        STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView * ppshv) PURE;
        STDMETHOD(OnStateChange) (THIS_ struct IShellView * ppshv,
                    ULONG uChange) PURE;
        STDMETHOD(IncludeObject) (THIS_ struct IShellView * ppshv,
                    LPCITEMIDLIST pidl) PURE;
    };
    
    typedef ICommDlgBrowser * LPCOMMDLGBROWSER;
    

    und ist in der Header-Datei shlobj.h von der WinAPI deklariert. Wenn ich nun versuche, eine Instanz davon auf dem Stack abzulegen, bekomme ich den Fehler:

    [C++Fehler] Unit1.cpp(20): Cannot create instance of abstract class 'ICommDlgBrowser'.
    [C++Fehler] Unit1.cpp(20): Class 'ICommDlgBrowser' is abstract because of '__stdcall ICommDlgBrowser::QueryInterface(const _GUID &,void * 😉 = 0'.

    Dazu hab ich mir die Hilfe angeschaut, die mir sagt, dass die verwendeten Funktionen bei nem solchen Fehler virtuell sind. Dann heißt das wohl, ich muss ne Klasse von ICommDlgBrowser ableiten und alle Funktionen neu (nicht virtuell) definieren. Ich habs so versucht:

    DECLARE_INTERFACE_(IMyCommDlgBrowser, ICommDlgBrowser)
    {
        // *** IUnknown methods ***
        STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj);
        STDMETHOD_(ULONG,AddRef) (THIS);
        STDMETHOD_(ULONG,Release) (THIS);
    
        // *** ICommDlgBrowser methods ***
        STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView * ppshv);
        STDMETHOD(OnStateChange) (THIS_ struct IShellView * ppshv,
                    ULONG uChange);
        STDMETHOD(IncludeObject) (THIS_ struct IShellView * ppshv,
                    LPCITEMIDLIST pidl);
    };
    

    Leider bekomme ich dann zu jeder Funktion ein unresolved external. Ich hab echt keinen Plan. Kann mir jemand weiterhelfen?



  • ich seh bei dem code nicht durch ... aber:

    wenn eine abstrakte klasse (oder hier ein interface), dann leite sie ab und implementiere die funktionen.

    wo sind die implementierungen? also die funktionen definiert?

    wo leitest du ab?

    bis bald 🙂



  • wenn eine abstrakte klasse (oder hier ein interface), dann leite sie ab und implementiere die funktionen.

    Ich denke, die sind schon implementiert (s.u.)

    ich seh bei dem code nicht durch

    Ich auch nicht. 😉

    wo sind die implementierungen? also die funktionen definiert?

    In den Windows DLLs.

    wo leitest du ab?

    da: 😉

    DECLARE_INTERFACE_(IMyCommDlgBrowser, ICommDlgBrowser)
    


  • hmm ... wenn ich eine abstrakte klasse baue, dann setzte ich die virtuellen funktionen gleich null und will dich damit zwingen, sie zu definieren.

    sieh zum beispiel bei java das mouse interface, da musst du alle 5 "mausmöglichkeiten" definieren, auch wenn du nur eine bräuchtest.

    aber wie gesagt, noch keinen genauen plan, was du machst 😉



  • Das gehört wohl eher nach WinApi



  • virtuelle funktionen nach winapi? finde, das ist standard... 😉



  • bei COM ist doch alles anders 🙂



  • CoCreateInstance



  • Class 'ICommDlgBrowser' is abstract because of '__stdcall ICommDlgBrowser::QueryInterface(const _GUID &,void * 😉 = 0'.

    Das ist die entscheidene Fehlermeldung. Es handelt sich hier also um ein COM-Interface. Und da COM nix mit Standard-C++ zu tun hat, passt die Frage nicht hier her. Es reicht hier schließlich nicht einfach eine abstrakte Methdoe zu überschreiben. Ohne COM-Zeugs wirst du hier nicht weiterkommen.

    Das gehört wohl eher nach WinApi

    Sehe ich auch so.



  • Jo, danke, Leute. War mir vorher nicht bekannt, dass das zu COM gehört und ich CoCreateInstance() und CoInitialize() aufrufen muss. Hab's jetzt, und es funzt prima. Vielen Dank nochmal für die Hinweise. 🙂


Anmelden zum Antworten