Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 607
  • Last Modified:

MFC & Classes created from typelib

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
redbaron082997
Asked:
redbaron082997
  • 3
  • 2
1 Solution
 
redbaron082997Author Commented:
Edited text of question
0
 
redbaron082997Author Commented:
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
 
jkrCommented:
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
 
redbaron082997Author Commented:
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
 
jkrCommented:
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

Free Backup Tool for VMware and Hyper-V

Restore full virtual machine or individual guest files from 19 common file systems directly from the backup file. Schedule VM backups with PowerShell scripts. Set desired time, lean back and let the script to notify you via email upon completion.  

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now