Microsoft KB Archive/137357

= How to insert objects without using the InsertObject dialog box by using Visual C++ =

Article ID: 137357

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 1.5 Professional Edition

 Microsoft Visual C++ 1.51

 Microsoft Visual C++ 1.52 Professional Edition

 Microsoft Visual C++ 2.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.1</li></ul>

 Microsoft Visual C++ 2.2</li></ul>

 Microsoft Visual C++ 4.0 Standard Edition</li></ul>

 Microsoft Visual C++ 4.1 Subscription</li></ul>

 Microsoft Visual C++ 4.2 Enterprise Edition</li></ul>

 Microsoft Visual C++ 5.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 4.2 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 5.0 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Professional Edition</li></ul>

<ul> <li>Microsoft Visual C++ 6.0 Standard Edition</li></ul>

<ul> <li>Microsoft Visual C++ .NET 2002 Standard Edition</li></ul>

<ul> <li>Microsoft Visual C++ 2005 Express Edition</li></ul>

<ul> <li>Microsoft Visual C++ .NET 2003 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q137357

<div class="notice_section">

Note Microsoft Visual C++ .NET (2002) supports both the managed code model that is provided by the Microsoft .NET Framework and the unmanaged native Microsoft Windows code model. The information in this article applies only to unmanaged Visual C++ code.

Note Microsoft Visual C++ 2005 supports both the managed code model that is provided by the .NET Framework and the unmanaged native Windows code model.

<div class="summary_section">

SUMMARY
When building an OLE container or OLE server application using MFC OLE classes, you should insert an OLE embedded object programmatically, without using the InsertObject dialog box. This article show you how.

In a default MFC AppWizard-generated OLE container or OLE server application, a command handler is implemented to enable the user to insert an object by clicking Insert New Object on the Edit menu. The AppWizard-generated code makes use of the COleInsertDialog class, which is an MFC wrapper for the OLEUIINSERTOBJECT common dialog box. The COleInsertDialog data and member functions are used to embed the object.

<div class="moreinformation_section">

MORE INFORMATION
The member function most responsible for the embedding of an OLE object is COleInsertDialog::CreateItem, which takes a pointer to a COleClientItem as a formal parameter.

When the user clicks Insert New Object on the Edit menu, a COleInsertDialog is created, and it is shown by calling its DoModal function. When the dialog box is dismissed, some of its data members are set by selections made by the user, such as Create From File or Create New.

The implementation of COleInsertDialog::CreateItem calls the COleClientItem member functions to embed the object, which leads to the solution of by- passing the COleInsertDialog class and calling COleClientItem to do the work.

Here is an excerpt from COleInsertDialog::CreateItem: *******Begin Excerpt******* switch (selType) {    case linkToFile: // link to file selected ASSERT(m_szFileName[0] != 0); bResult=pNewItem->CreateLinkFromFile(m_szFileName); break;

case insertFromFile: // insert file selected ASSERT(m_szFileName[0] != 0); bResult=pNewItem->CreateFromFile(m_szFileName); break;

default: // otherwise must be create new ASSERT(selType == createNewItem); bResult=pNewItem->CreateNewItem(m_io.clsid); break; }

This code features a switch structure whose logic flow is controlled by the selType set by the user interaction with the COleInsertDialog dialog box.
 * End Excerpt*******

The following code demonstrates how to insert an OLE embedded object programmatically. The code shows the creation of an instance of a COleClientItem object, which then calls its CreateNewItem member function to create and embed a Microsoft Excel worksheet.

Sample code
/* Compile options needed : None */

void CMyView::OnInsertObject {

BeginWaitCursor;

CMyOleClientItem* pItem = NULL; TRY {        // Create new item connected to this document. CMyDoc* pDoc = GetDocument; ASSERT_VALID(pDoc); pItem = new CMyOleClientItem(pDoc); ASSERT_VALID(pItem);

// Get Class ID for Excel sheet // This is used in creation CLSID clsid; This following line should be like this: if(FAILED(::CLSIDFromProgID(OLESTR("Excel.Sheet"),&clsid))) AfxThrowMemoryException;

if(FAILED(::CLSIDFromProgID("Excel.Sheet",&clsid))) AfxThrowMemoryException;

// Create the Excel embedded item if(!pItem->CreateNewItem(clsid)) AfxThrowMemoryException; // any exception will do         ASSERT_VALID(pItem);

// Launch the server to edit the item. pItem->DoVerb(OLEIVERB_SHOW, this);

ASSERT_VALID(pItem);

// As an arbitrary user interface design, this sets the // selection to the last item inserted.

// TODO: reimplement selection as appropriate for your // application

m_pSelection = pItem;  // set selection to last inserted item pDoc->UpdateAllViews(NULL); }    CATCH(CException, e)     { if (pItem != NULL) {          ASSERT_VALID(pItem); pItem->Delete; }        AfxMessageBox(IDP_FAILED_TO_CREATE); }    END_CATCH

EndWaitCursor; }

Keywords: kbcode kbdlg kbhowto KB137357

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.