One MDI program acts as OLE Container and OLE Server : Is th
Lee Jae Kil -- juria@seodu.co.kr Saturday, April 20, 1996 Environment: VC++ 4.0 / Win 95 or Win NT (Not Environment specific.) Hi, everyone. I want to merge two application as one. App1 - MDI application OLE container : Compund Document, Need not support inplace editing. App2 - MDI application OLE server : Act as ordinary OLE server. For example, MFC OLE samples have DrawClient, and Scribble OLE server. I've tried merging two application as one. If I insert object other that scribble, then OK. If I insert scribble object, I can't. Above functionality is similar visio, which has template as container(no inplace editing, show only iconic shape), drawing window as server. I can make the functionality not using OLE. But can this situation possible using OLE and/or MFC. There are OLE inproc server, inproc handler, local server, remote server. But none of these are above situation. Any reply is appreciated. TIA ---- Lee, Jae Kil : juria@seodu.co.kr
Brad P. Exchange -- Brad.P.Smith@Cognos.COM Friday, April 26, 1996 >> >From: Lee Jae Kil[SMTP:juria@seodu.co.kr] I want to merge two application as one. App1 - MDI application OLE container : Compund Document, Need not support inplace editing. App2 - MDI application OLE server : Act as ordinary OLE server. For example, MFC OLE samples have DrawClient, and Scribble OLE server. I've tried merging two application as one. If I insert object other that scribble, then OK. If I insert scribble object, I can't. Above functionality is similar visio, which has template as container(no inplace editing, show only iconic shape), drawing window as server. I can make the functionality not using OLE. But can this situation possible using OLE and/or MFC. There are OLE inproc server, inproc handler, local server, remote server. But none of these are above situation. << It's certainly possible to have a single app be both a Container and Server. What you *can't* do, at least via MFC, is embed an object of yourself as yourself. We ran into this a while ago, and a KnowledgeBase article was written on this after we posed a question to MS (we're on Premier Support). Essentially, MFC cannot handle "self-embedding". The article (Q121949) clearly explains why this is very difficult to achieve, and I don't think you can work around that limitation. Unfortunately, MFC also fails to *prevent* your application from attempting to insert yourself. This is unfortunate since the code to do this is reasonably simple. Below is a slightly sanitized version of what I ended up writing. You'd want to put this inside a TRY/CATCH block, but otherwise you can use it almost verbatum. --- cut here --- COleInsertDialog dlg;// We won't support embedding our doc inside another of our docsCImpDoc *pDoc = (CImpDoc*)(pView->GetDocument());CLSID myClsid = pDoc->m_pFactory->GetClassID();dlg.m_io.cClsidExclude = 1;dlg.m_io.lpClsidExclude = (LPCLSID)&myClsid;dlg.SetHelpID(IDD_INSERT_OLE_OBJECT);if (dlg.DoModal() != IDOK) AfxThrowMemoryException(); // any exception will do// The user can still do a "Create From File" of one of our// file types. We need to trap that. Unfortunately, it seems the// only "reliable" method is by comparing extensions.if( dlg.m_io.lpszFile && *(dlg.m_io.lpszFile) ){ char ext[_MAX_EXT]; _splitpath( dlg.m_io.lpszFile, NULL, NULL, NULL, ext ); if( ext && *ext ) { _fstrupr( ext ); CString reportExt; CString templateExt; reportExt.LoadString(IDS_REPORT_EXT); reportExt.MakeUpper(); templateExt.LoadString(IDS_TEMPLATE_EXT); templateExt.MakeUpper(); if( !reportExt.CompareNoCase( ext ) || !templateExt.CompareNoCase( ext ) ) { ImpMessageBox(IDP_SELF_EMBED_REJECTED); AfxThrowMemoryException(); // any exception will do } }}--- cut here --- BTW, if somebody can think of a better way to handle the "Create From File" problem other than comparing extensions, I'd love to hear about it. :-) Hope this helps; Brad.
| Вернуться в корень Архива |