Solved

cannot instantiate abstract class due to following members

Posted on 2005-05-17
3
633 Views
Last Modified: 2013-11-25
I've created a COM component with 2 CoClasses Cbar and Cfoo.  I then add a property to Ibar, called foobar, specifying a Property type of Ifoo *.  Now normally if I defined a property of type int, long etc., when I did a build I would end up with
STDMETHODIMP Cbar::get_abcbar(short *pVal) { // TODO: Add your implementation code here  return S_OK; }

STDMETHODIMP Cbar::put_abcbar(short newVal) { // TODO: Add your implementation code here return S_OK;}
in bar.cpp.
However this doesn't happen when I add my property of type Ifoo*.  Consequently when I compile I get the error
"cannot instantiate abstract class due to following members"
:get_foobar(struct Ifoo ** )' : pure virtual function was not defined
etc.
 
Here is the IDL
      [
            object,
            uuid(1BB29A26-A096-4E00-B7B9-9B77B9B0B35D),
            dual,
            helpstring("Ifoo Interface"),
            pointer_default(unique)
      ]
      interface Ifoo : IDispatch
      {
      };
      [
            object,
            uuid(AB73E6E4-11B1-4182-AD07-01641772A1F0),
            dual,
            helpstring("Ibar Interface"),
            pointer_default(unique)
      ]
      interface Ibar : IDispatch
      {
            [propget, id(1), helpstring("property foobar")] HRESULT foobar([out, retval] Ifoo* *pVal);
            [propput, id(1), helpstring("property foobar")] HRESULT foobar([in] Ifoo* newVal);
      };
0
Comment
Question by:ascot
  • 2
3 Comments
 
LVL 9

Accepted Solution

by:
rcarlan earned 250 total points
ID: 14022227
You haven't specified how you're adding the properties to your COM interfaces. I assume you're using the ATL Wizard in Visual Studio - i.e. you right-click on the Ibar interface in the ClassView browser and choose Add Property.

If this is the case, the ATL Wizard should:
1. add the properties to the IDL file (a propget and a propput)
2. add the corresponding method declarations to the C++ class that implements the COM object
3. add a bogus implementation for these methods in the cpp file containing the implementation of the C++ class

Seems to me like 1, and possibly 2, are happening, but definitely not 3.

Unfortunately, the ATL Wizard does have its quirks and, while I have never experienced this particular problem myself, I’ve certainly had my share of problems with the ATL Wizard.

It’s possible that somebody may be able to help you out with the changes you would have to make to your file(s) or project to get the ATL Wizard to work properly. However, in the mean time, you can get over this hurdle by manually updating the C++ class that implements the Ibar interface.

You have two options:

1. Having used the ATL Wizard to add the Ifoo property, open the header file corresponding to the C++ class that implements the COM object and see if the ATL Wizard has added the two methods (e.g. get_foobar and put_foobar). If it hasn’t, add the following lines:
STDMETHOD(get_foobar)(/*[out, retval]*/ Ifoo** ppIfoo);
STDMETHOD(put_foobar)(/*[in]*/ Ifoo* pIfoo);

Then, open the cpp file corresponding to C++ class implementation and add:

STDMETHODIMP Cbar::get_foobar(Ifoo** ppIfoo)
{
      return E_NOTIMPL;
}

STDMETHODIMP Cbar::put_foobar(Ifoo* pIfoo)
{
      return E_NOTIMPL;
}


2. Alternatively, since you said that adding long properties works as expected, add a long property instead of Ifoo (you may want to also give IUnknown a try) and then manually edit the IDL, h and cpp files to change the property’s type to Ifoo.


None of these solutions are ideal, as they do require tedious manual labour, but at least you’ll be able to move on with your work.

Radu

0
 

Author Comment

by:ascot
ID: 14025317
Thanks for the input.  Tried again this morning to see if it was the order that I was creating my ATL objects that was causing the problem.
First of all did the following:-
Create project using ATL COM Wizard.
Create DLL.
Right click on Project folder - NEW ATL Object - Simple Object - Short Name "foo"
Right click on Project folder - NEW ATL Object - Simple Object - Short Name "bar"
In Class View, right click on Ibar and select "Add Property.  Specify Prperty Type as Ifoo*, Property Name foobar.

Every built ok.

So then tried

Create project using ATL COM Wizard.
Create DLL.
Right click on Project folder - NEW ATL Object - Simple Object - Short Name "bar"
Right click on Project folder - NEW ATL Object - Simple Object - Short Name "foo"
In Class View, right click on Ibar and select "Add Property.  Specify Prperty Type as Ifoo*, Property Name foobar.

When I build I get the error
error MIDL2025 : syntax error : expecting a type specification near "Ifoo"
error MIDL2026 : cannot recover from earlier syntax errors; aborting compilation  

so I edited the IDL file to move the Ifoo interface definition before the Ibar interface definition and everything built ok.  
So I am at a loss to understand why things failed previously.

But again thanks for a very clear response which did help me understand the problem.
0
 
LVL 9

Expert Comment

by:rcarlan
ID: 14025568
I've been doing MFC and ATL programming for longer than I care to remember. OK, I'm going to admit it: I started with Visual C++ (that is, the first version, 16 bit, Win 3.1, back in 1993) and I've been doing it ever since. It doesn't get any longer than that :-)

Anyway, with the experience I have I can say this: the Wizards are great (at least the MFC Wizard, 'cause the ATL one is pretty useless;-) but you have to understand what it is that they do. There's no magic (despite the fact they're called Wizards:-). All they do is to insert code snippets. Once you understand exactly what code you get from them and under what circumstances, you become much better at using them (or not using them - as the case may be;-). You have to become comfortable with editing the code they generate, with typing the stuff in yourself, etc.

Documentation helps, searching on the NET, asking questions on Experts Exchange ;-) but the best tool is a source control system (even if it's a personal one, with the repository on your local machine). Check the files out, invoke a Wizard command, and do a "Show Differences". Doesn't get much clearer than that.

I'm sure you've already learned a lot about the ATL Wizard through this exercise. You had the right approach: follow a sequence of steps and analyse the results.

Good luck in your programming career.

Radu
0

Featured Post

ScreenConnect 6.0 Free Trial

Want empowering updates? You're in the right place! Discover new features in ScreenConnect 6.0, based on partner feedback, to keep you business operating smoothly and optimally (the way it should be). Explore all of the extras and enhancements for yourself!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This is about my first experience with programming Arduino.
Whether you’re a college noob or a soon-to-be pro, these tips are sure to help you in your journey to becoming a programming ninja and stand out from the crowd.
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question