How to implement doc.Close
David Shillito -- David_Shillito@msn.com
Monday, January 20, 1997
Environment: NT 4.0, MSVC 4.1
I am having difficulty trying to implement the automation method Close() on my
document object which is derived from COleServerDocument .
I found the sample XRTFRAME on the MSDN CD and used a lot of the code from it
but the Close method (in DOC.CPP) doesnt seem to actually delete the document.
It sets m_bAutoDelete to FALSE and then calls OnCloseDocument. The document
object itself is only deleted in OnFinalRelease. This implies that the
document still exists after Close and it will only be released when the client
(VB for example) does a Set theDoc = Nothing or lets the object variable go
out of scope. That allows the possibility that the client could actually try
to call further methods of the document after calling Close - whjich would
lead to some interesting behavior on this 99% closed document object!
Substituting Excel for my automation server I have been able to demonstrate
the Excel DOES release the object during the Close method (on a WorkBook, i.e.
a document).
If I modify my server to delete the document as part of the Close method then
I get an Application Error on the OLE automation libraries. I dont think it is
permissible to delete this in an automation method since, for example, the
code for COleDispatchImpl::Invoke in OLEDISP1 does
// restore original m_bResultExpected flag
pThis->m_bResultExpected = bResultExpected;
after my method code returns, and pThis at this time will have been released.
Does anyone else have any experience of implementing similar server behavior,
i.e.
Set w = myApp.WorkBooks.Add
w.SomeManipulation
w.Close ' <<<<<< this method
and could you explain what is going on and how to code around this in MFC?
David Shillito
Scott Daniels -- scottdfl@sprynet.com
Wednesday, January 22, 1997
[Mini-digest: 2 responses]
Environment: Win95, MSVC 4.1
I would like to use a list control just like that used in Internet Mail for
multi-column data. I don't care for the CListCtrl because the selection and
mouse-down to select only applies to the first column. In other words, you
must click on the first column in order to select a line. I know I can
implement what I want using the CHeaderCtrl with a CListBox, but it is not
as automatic as the CListCtrl. Are there any such controls or classes
available?
Thanks very much,
Scott Daniels scottdfl@sprynet.com
"Life appears the way you choose to see it."
-----From: mfc-l@netcom.com
>From mfc-l Mon Jan 20 10:31:33 UT 1997 remote from netcom.com
Received: from netcom.com by tc4d1.cmc.stph.net; Wed, 22 Jan 1997 20:24 EST
Received: by majordomo.netcom.com (8.7.5/8.7.3/(NETCOM MLS v1.01)) id IAA07296; Tue, 21 Jan 1997 08:42:48 -0800 (PST)
Date: Mon, 20 Jan 97 10:31:33 UT
From: "David Shillito"
Message-Id:
To: "MFC-L mailing list"
Subject: How to implement doc.Close
Sender: owner-mfc-l@majordomo.netcom.com
Errors-To: owner-mfc-l@majordomo.netcom.com
Precedence: bulk
Reply-To: mfc-l@netcom.com
Content-Type: text
Content-Length: 1741
Environment: NT 4.0, MSVC 4.1
I am having difficulty trying to implement the automation method Close() on my
document object which is derived from COleServerDocument .
I found the sample XRTFRAME on the MSDN CD and used a lot of the code from it
but the Close method (in DOC.CPP) doesnt seem to actually delete the document.
It sets m_bAutoDelete to FALSE and then calls OnCloseDocument. The document
object itself is only deleted in OnFinalRelease. This implies that the
document still exists after Close and it will only be released when the client
(VB for example) does a Set theDoc = Nothing or lets the object variable go
out of scope. That allows the possibility that the client could actually try
to call further methods of the document after calling Close - whjich would
lead to some interesting behavior on this 99% closed document object!
Substituting Excel for my automation server I have been able to demonstrate
the Excel DOES release the object during the Close method (on a WorkBook, i.e.
a document).
If I modify my server to delete the document as part of the Close method then
I get an Application Error on the OLE automation libraries. I dont think it is
permissible to delete this in an automation method since, for example, the
code for COleDispatchImpl::Invoke in OLEDISP1 does
// restore original m_bResultExpected flag
pThis->m_bResultExpected = bResultExpected;
after my method code returns, and pThis at this time will have been released.
Does anyone else have any experience of implementing similar server behavior,
i.e.
Set w = myApp.WorkBooks.Add
w.SomeManipulation
w.Close ' <<<<<< this method
and could you explain what is going on and how to code around this in MFC?
David Shillito
| Вернуться в корень Архива
|