15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Q. About OLE Automation & OLE compound document support

Edelmiro Fuentes -- Edelmiro.Fuentes@cui.unige.ch
Friday, June 14, 1996

Hello, 

Environment: Window NT 4.0 (build 1234)
Visual C++ 4.0

I created an MDI automation server application. I used all the defaults
suggested by the AppWizard (except, of course, the  OLE automation support
which I selected). This server exposes two methods:

   void ShowWindow()  (taken from the AUTOCLICK example) 
     =>displays the window when an automation controller connects

and
 
   BSTR SendGreetings()
     =>sends a dummy message to the client. 

For the automation client, I made in the same way. I used all the defaults
from AppWizard and I selected the OLE automation support. 
I added a class from the OLE Type Lib created by the Server. 
For the connection, I create the dispatch in the OnNewDocument function and
invoke ShowWindow:

//------------------------------------------------------------
   COleException exc;

   if (!m_ctxolesrv.CreateDispatch(_T("Srv2Test.Document"), &exc))
	{
		AfxMessageBox("Cannot Create Server");
		return FALSE;	// fail
	}

   m_ctxolesrv.ShowWindow();

//---------------------------------------------------------------

It works OK. When the automation client starts, the server starts
automatically and displays the "document" window opened by the client. 
When the client exits, the window displayed in the server is closed.
If there are no more open documents, the server exits itself. 
 
The problem starts when I modified the server in order to have the OLE
compound document support (as a full-server). 
I create a new automation server application exactly in the same way as
before. The only difference is that I also select OLE compound document
support as a full-server.Everything seems to work in the same way but when
the client exits,
the window opened in the server by this client remains open. And when
I try to close manually this window in the server, a dialog window
appears asking me if I want to save changes to a document that I never modified.

- Is this behaviour normal? 

- How can I make the server to close the document? (I've already tried
  the ReleaseDispatch() but it did not work) .

- Why and when is the modified flag set to true?


Thanks in advance for your help


Edelmiro
--------------------------------------------------------------------
Edelmiro Fuentes                       Edelmiro.Fuentes@cui.unige.ch
Centre Universitaire d'Informatique
24, Rue General-Dufour                      Tel. +41 (22) 705 76 71
CH-1211 GENEVE 4 SWITZERLAND                Fax. +41 (22) 705 77 80
--------------------------------------------------------------------




Edelmiro Fuentes -- Edelmiro.Fuentes@cui.unige.ch
Tuesday, June 25, 1996

Hello, 

Environment: Window NT 4.0 (build 1234)
Visual C++ 4.0

I created an MDI automation server application. I used all the defaults
suggested by the AppWizard (except, of course, the  OLE automation support
which I selected). This server exposes one method:

//-------------------------------------------------------------

// displays the window when an automation controller connects
// taken from the AUTOCLICK example

void CSrv2TestDoc::ShowWindow() 
{
   // TODO: Add your dispatch handler code here
   POSITION pos = GetFirstViewPosition();
   CView* pView = GetNextView(pos);
   if (pView != NULL)
      {
	CFrameWnd* pFrameWnd = pView->GetParentFrame();
	pFrameWnd->ActivateFrame(SW_SHOW);
	pFrameWnd = pFrameWnd->GetParentFrame();
	if (pFrameWnd != NULL)
	   pFrameWnd->ActivateFrame(SW_SHOW);
       }
}

//----------------------------------------------------------------

For the automation client, I also used all the defaults from AppWizard and I
selected the OLE automation support. 
With the ClassWizard, I added a class from the OLE Type Lib created by the
Server. 
For the connection, I create the dispatch in the OnNewDocument function and
invoke ShowWindow:

//------------------------------------------------------------
   COleException exc;

   if (!m_ctxolesrv.CreateDispatch(_T("Srv2Test.Document"), &exc))
	{
		AfxMessageBox("Cannot Create Server");
		return FALSE;	// fail
	}

   m_ctxolesrv.ShowWindow();

//---------------------------------------------------------------

It works OK. When the automation client starts, the server starts
automatically and displays the "document" window opened by the client. 
When the client exits, the window displayed in the server is closed.
If there are no more open documents, the server exits itself. 
 
The problem starts when I modified the server in order to have the OLE
compound document support (as a full-server). 
I create a new automation server application exactly in the same way as
before. The only difference is that I also select OLE compound document
support as a full-server. Everything seems to work in the same way but when
the client exits, the window opened in the server by this client remains
open. And when I try to close manually this window in the server, a dialog
window appears asking me if I want to save changes to a document that I
never modified.

- Is this behaviour normal? 

- How can I make the server to close the document? (I've already tried invoking
  the ReleaseDispatch() in the client but it did not work) .

- Why and when is the modified flag set to true?

Thanks in advance for your help


Edelmiro


--------------------------------------------------------------------
Edelmiro Fuentes                       Edelmiro.Fuentes@cui.unige.ch
Centre Universitaire d'Informatique
24, Rue General-Dufour                      Tel. +41 (22) 705 76 71
CH-1211 GENEVE 4 SWITZERLAND                Fax. +41 (22) 705 77 80
--------------------------------------------------------------------




Alberto Massari -- alby@belva.laboratorium.dist.unige.it
Friday, June 28, 1996

At 08:37 AM 6/25/96 +0000, you wrote:
>
>- Is this behaviour normal? 
>
>- How can I make the server to close the document? (I've already tried invoking
>  the ReleaseDispatch() in the client but it did not work) .
>
>- Why and when is the modified flag set to true?

At this time, I have an answer only for the last question: by default, every
document created via OLE starts "dirty", that is, the MFC code explicitly
calls SetModifiedFlag().

        Alberto Massari
-----------------------------------------------------------------------
Alby@MusArt.dist.unige.it is: 	Alberto Massari

Computer Music Lab
Universy of Genoa	-ITALY-     http://MusArt.dist.unige.it/~alby/
-----------------------------------------------------------------------





| Вернуться в корень Архива |