COM Interfaces for inherited interfaces necessary?
Michael S. Scherotter -- mss@tartus.com Thursday, April 11, 1996 Using VC4.1, NT3.51 I am creating an MFC COM object using CCmdTarget: I want to use the Interface IPropertyPage2 with the following code in the header: DECLARE_INTERFACE_MAP() BEGIN_INTERFACE_PART(PropertyPage2, IPropertyPage2) INIT_INTERFACE_PART(TDPropertyPage, PropertyPage2) // IPropertyPage methods STDMETHOD(SetPageSite)(THIS_ LPPROPERTYPAGESITE pPageSite); STDMETHOD(Activate)(THIS_ HWND hwndParent, LPCRECT lprc, BOOL bModal); STDMETHOD(Deactivate)(THIS); STDMETHOD(GetPageInfo)(THIS_ LPPROPPAGEINFO pPageInfo); STDMETHOD(SetObjects)(THIS_ ULONG cObjects, LPUNKNOWN FAR* ppunk); STDMETHOD(Show)(THIS_ UINT nCmdShow); STDMETHOD(Move)(THIS_ LPCRECT prect); STDMETHOD(IsPageDirty)(THIS); STDMETHOD(Apply)(THIS); STDMETHOD(Help)(THIS_ LPCOLESTR lpszHelpDir); STDMETHOD(TranslateAccelerator)(THIS_ LPMSG lpMsg); // IPropertyPage2 methods STDMETHOD(EditProperty)(THIS_ DISPID dispid); END_INTERFACE_PART(PropertyPage2) My question is: Do I need to do a inteface section for IPropertyPage as well? What will happen when QueryInterfece(IPropertyPage) is called? Thanks in advance, Michael -- Michael S. Scherotter |Architectural Design Tools Lead Software Developer |AutoCAD Applications Tartus Development, Inc. |Custom CAD Solutions 630 Las Gallinas Ave #300 |__________________________ San Rafael, CA 94903 mss@tartus.com (415) 491-8925 michael@charette.com (415) 491-8921 (fax) 71035.1675@compuserve.com ____________________________________________________________
Gareth Jones -- gaj@i2.co.uk Monday, April 15, 1996 [Mini-digest: 3 responses] Michael Scherotter wrote: Using VC4.1, NT3.51 I am creating an MFC COM object using CCmdTarget: I want to use the Interface IPropertyPage2 with the following code in the header: DECLARE_INTERFACE_MAP() << code deleted>> My question is: Do I need to do a inteface section for IPropertyPage as well? What will happen when QueryInterfece(IPropertyPage) is called? You don't need an interface section in the header. Assuming your IPropertyPage2 is a fully functional IPropertyPage, (as you would normally expect a derived interface to be) then you just need two entries in your INTERFACE_MAP in the .cpp file. They should both point to the same embedded class, (PropertyPage2) but should have the IIDs of the two interfaces respectively. Gareth ----------------------------------------------------------------- Gareth Jones Software Consultant visualize2analyse gaj@i2.co.uk i2 Ltd, Cambridge, UK information2image -----From: "John Elsbree"You don't need anything extra in the header. Just put two entries in the interface map in your .cpp file: one for each interface: BEGIN_INTERFACE_MAP(TDPropertyPage, CCmdTarget) INTERFACE_PART(TDPropertyPage, IID_IPropertyPage, PropertyPage2) INTERFACE_PART(TDPropertyPage, IID_IPropertyPage2, PropertyPage2) END_INTERFACE_MAP() John (not speaking for Microsoft) -----From: "David W. Gillett" > Do I need to do a inteface section for IPropertyPage as well? > What will happen when QueryInterfece(IPropertyPage) is called? Although COM interfaces are easily coded in C++, they're not inherently C++-aware, and in particular there is no automatic inheritance. Although you can probably re-use much of your *implementation* code, nothing in COM knows -- as I read it -- that there is any kind of special relationship between the IPropertyPage and IPropertyPage2 interfaces. QueryInterface(IPropertyPage) should fail if you don't provide IPropertyPage. Dave
| Вернуться в корень Архива |