Solved

MFC & Classes created from typelib

Posted on 1999-01-24
5
549 Views
Last Modified: 2013-11-25
I have created an ATL library, that has a method to display a messagebox. I am having a problem with the proper way to create an instance, and call it's display method within MFC. My test app is a MFC APPWIZARD Dialog based. I have added a button, and on it onclick is where I want to create the object, and call it's display method.

I have used the classwizard to add a class from a type library for the object. Here is the class header:

class IMainObject : public COleDispatchDriver
{
public:
      IMainObject() {}            // Calls COleDispatchDriver default constructor
      IMainObject(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
      IMainObject(const IMainObject& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

// Attributes
public:

// Operations
public:
      void Display();
      LPDISPATCH CreateSeparateObject();
      LPDISPATCH CreateAndInitializeSeparateObject();
};

What would I place in this function to call IMainObjects Display method?

void CMFCClientDlg::OnButton1()
{
}

Second: How would I properly address the function of IMainObject::CreateSeparateObject. This is supposed to return an initialized object. Here is it's header

class ISeparateObject : public COleDispatchDriver
{
public:
      ISeparateObject() {}            // Calls COleDispatchDriver default constructor
      ISeparateObject(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
      ISeparateObject(const ISeparateObject& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}

// Attributes
public:

// Operations
public:
      void Display();
};

What is confusing is that it is returning a type of LPDISPATCH, and I can not properly cast it to a type ISeparateObject.

I thought I could do this:

ISeparateObject *pSep;
pSep = pMain->CreateSeparateObject();

This works when I am not using MFC, but rather straight ATL.

These are examples taken from WROX Press's Beginning ATL COM Programming.

Thanks
0
Comment
Question by:redbaron082997
  • 3
  • 2
5 Comments
 
LVL 1

Author Comment

by:redbaron082997
ID: 1328241
Edited text of question
0
 
LVL 1

Author Comment

by:redbaron082997
ID: 1328242
I have it working with this code, Is this correct? What could be different and/or improved?
void CMFCClientDlg::OnButton1()
{
      IMainObject* pMain = NULL;

      pMain = new IMainObject;
      if ( NULL != pMain ) {
            pMain->CreateDispatch("ReturningAnObject.MainObject");
            pMain->Display();
            pMain->CreateSeparateObject();
            ISeparateObject pSep(pMain->CreateAndInitializeSeparateObject());
            pSep.Display();
            pMain->DetachDispatch();
            pSep.DetachDispatch();
            delete pMain;
      }
}

0
 
LVL 86

Expert Comment

by:jkr
ID: 1328243
That's absolutely correct. The constructor of ISeparateObject uses the base class constructor which calls COleDispatchDriver::AttachDispatch() internally...
(I submit this as a comment, as you solved your problem. If you want me to answe and/or need more information, feel free to ask...)
0
 
LVL 1

Author Comment

by:redbaron082997
ID: 1328244
Here is the problem. Then function CreateAndInitializeSeparateObject()  creates the memory space, and needs to be deleted. How is it deleted?  In ATL, I used something like this
ISeparateObject *pSep;
pSep = pMain->CreateAndIn...();
pSep->Display();
pSep->Release();

Second (You can submit this as the answer)
Why would one use this approach vs #import "file.dll" or #import "File.tlb"?

Thanks
Ronnie


0
 
LVL 86

Accepted Solution

by:
jkr earned 100 total points
ID: 1328245
It simply depends on your implementation of the object. If the last call to 'Release()' also frees the object (e.g. 'if ( !m_cRef) delete this;', there should be no problem. But the MFC implementation of IDispatch usualy takes care of cleaning up, anyway....

And, the only reason to use this approach is simply MFC, so to say, the benefits of being able to use the application framework - i agree to you, it's kinda clumsy... but it fits into the framework ;-)
0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Introduction: Hints for the grid button.  Nested classes, templated collections.  Squash that darned bug! Continuing from the sixth article about sudoku.   Open the project in visual studio. First we will finish with the SUD_SETVALUE messa…
After several hours of googling I could not gather any information on this topic. There are several ways of controlling the USB port connected to any storage device. The best example of that is by changing the registry value of "HKEY_LOCAL_MACHINE\S…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…

708 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