Help and Support

PRB: Convert Dialog Doesn't Appear for OLE Object in MS Excel

Article ID:135765
Last Review:November 21, 2006
Revision:2.1
This article was previously published under Q135765
On This Page

SYMPTOMS

When the Edit|<Object>|Convert... menu item is selected for an OLE object that is embedded within a Microsoft Excel document, the Convert dialog box does not appear.

Back to the top

CAUSE

Microsoft Excel displays the Convert dialog for an object only if WriteFmtUserTypeStg has been used to write out a clipboard format and user-readable name for the contents of the object. The MFC libraries do not call this function when creating or saving OLE objects.

Back to the top

RESOLUTION

Call WriteFmtUserTypeStg in the Serialize method of your server's document class.

Back to the top

STATUS

This behavior is by design.

Back to the top

MORE INFORMATION

WriteFmtUserTypeStg should be called as part of your server's implementation of IPersistStorage::InitNew and IPersistStorage::Save. By default, MFC OLE server applications do not call WriteFmtUserTypeStg in their implementation of IPersistStorage::InitNew and IPersistStorage::Save. One simple way to achieve this functionality in an MFC application is to make the call to WriteFmtUserTypeStg in the Serialize method of the server's document class.

Back to the top

Steps to Add a Call to WriteFmtUserTypeStg

1.Provide a private clipboard format for your object.

WriteFmtUserTypeStg serializes a clipboard format and user-readable name for the contents of an object to its storage. The HIERSVR sample shows how to provide a private clipboard format for your object if you do not already have one.
2.Add the DoWriteFmtUserTypeStg helper function to your document class.

This helper function is used to encapsulate retrieving the clipboard format and user-readable name when calling WriteFmtUserTypeStg. The code in the "Sample Code" section of this article shows how to implement this function for the HIERSVR sample.
3.Modify the server document's Serialize() method and add a call to the DoWriteFmtUserTypeStg helper function, as shown in the following sample code.

Back to the top

Sample Code

   void CServerDoc::DoWriteFmtUserTypeStg(LPSTORAGE lpStorage)
   {
      LPOLEOBJECT lpObject = (LPOLEOBJECT)GetInterface(&IID_IOleObject);
      ASSERT(lpObject != NULL);
      CLSID clsid;
      lpObject->GetUserClassID(&clsid);

      LPTSTR pszUserType = NULL;
      OleRegGetUserType(clsid, USERCLASSTYPE_FULL, (LPOLESTR
   *)&pszUserType);

      if (pszUserType)
      {

         WriteClassStg(lpStorage, clsid);
         WriteFmtUserTypeStg(lpStorage, m_cfPrivate,
   (LPOLESTR)pszUserType);
         CoTaskMemFree(pszUserType);
      }
   }

   void CServerDoc::Serialize(CArchive& ar)
   {
     ASSERT(m_pRoot != NULL);

     if(IsEmbedded() && ar.IsStoring())
     {
       ASSERT(m_lpRootStg != NULL);
       DoWriteFmtUserTypeStg(m_lpRootStg);
     }

     SerializeFontInfo(ar);
     m_pRoot->Serialize(ar);
   }
				

Back to the top


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++ 5.0 Enterprise Edition
  Microsoft Visual C++ 6.0 Enterprise Edition
  Microsoft Visual C++ 2.0 Professional Edition
  Microsoft Visual C++ 2.1
  Microsoft Visual C++ 6.01 Professional Edition
  Microsoft Visual C++ 4.0 Professional Edition
  Microsoft Visual C++ 4.1 Subscription
  Microsoft Visual C++ 5.0 Professional Edition
  Microsoft Visual C++ 6.0 Professional Edition
  Microsoft Visual C++ 5.0 Learning Edition
  Microsoft Visual C++, 32-bit Learning Edition 6.0

Back to the top

Keywords: 
kbprb KB135765

Back to the top

Article Translations

 

Other Support Options

  • Contact Microsoft
    Phone Numbers, Support Options and Pricing, Online Help, and more.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.