Solved

cannot instantiate abstract class due to following members

Posted on 2005-05-17
3
627 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
Comment Utility
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
Comment Utility
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
Comment Utility
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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
This is about my first experience with programming Arduino.
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

771 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now