Microsoft KB Archive/135765

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

Article ID: 135765

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++ 5.0 Enterprise Edition</li></ul>

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

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

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

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

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

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

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

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

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

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

-

<div class="notice_section">

This article was previously published under Q135765

<div class="symptoms_section">

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.

<div class="cause_section">

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.

<div class="resolution_section">

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

<div class="status_section">

STATUS
This behavior is by design.

<div class="moreinformation_section">

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.

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.
 * 1) 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.
 * 1) Modify the server document's Serialize method and add a call to the DoWriteFmtUserTypeStg helper function, as shown in the following sample code.

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); }

Additional query words: alwaysupdate

Keywords: kbprb KB135765

-

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

© Microsoft Corporation. All rights reserved.