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

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


MFC opens SHARE_EXCLUSIVE

Mike Ward -- mikew@hilgraeve.com
Friday, June 07, 1996

Enviroment:Win95/VC++4.1

Here's a more detailed report of a question I asked earlier.

MFC's COleDocument::OnOpenDocument() opens files with the 
SHARE_EXCLUSIVE flag.  Here's a code snippet from mfc\src\oledoc1.cpp

   else
   {
    // open new storage file
    sc = StgOpenStorage(lpsz, NULL, 
        STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_EXCLUSIVE, 
        0, 0, &lpStorage);

    if (FAILED(sc) || lpStorage == NULL)
     sc = StgOpenStorage(lpsz, NULL,
         STGM_READ|STGM_TRANSACTED|STGM_SHARE_DENY_WRITE,
         0, 0, &lpStorage);
   }
   if (FAILED(sc))
    AfxThrowOleException(sc);

   ASSERT(lpStorage != NULL);
   m_lpRootStg = lpStorage;

I'ld really like MFC to open the document as STGM_READWRITE |
STGM_TRANSACTED | STGM_SHARE_DENY_WRITE.  That way, I could have 
multiple readers of the document but only one writer.  Problem is, 
there is no clean way (that I can see) to have this happen.  I could 
override COleDocument::OnOpenDocument() but I'ld have to check my 
code against every new version of MFC that comes out and it assumes 
that the source code reflects what is actually in the binary.  I 
really think MFC blew it on this one.  Why would they not open the 
doc SHARE_DENY_WRITE by default?  Is there a way to work around this?



Erik Funkenbusch -- chucks@isd.net
Sunday, June 09, 1996

STGM_TRANSACTED is a really nasty can of worms that has to be implemented
*VERY* carefully for it to work successfully.  Most combinations of
STGM_TRANSACTED will not work with OLE, I wish I could tell you more but
I
no longer have access to the source that I wrote that successfully used
this.

I can tell you however that MFC probably doesn't use it because there are
a
GREAT deal of limitations on STGM transacted, so many that most people
would
be better off rolling their own.  One example is that only 20 "opens" are
allowed on a single Compound file.  

We accomplished this by writing our own file handling scheme.  We call
this from
within Serialize.  In so doing, however, we gave up the standard OLE
embedding
support and other niceties that you get with Serialize.

----------
> From: Mike Ward 
> To: mfc-l@netcom.com
> Subject: MFC opens SHARE_EXCLUSIVE
> Date: Friday, June 07, 1996 2:56 PM
> 
> Enviroment:Win95/VC++4.1
> 
> Here's a more detailed report of a question I asked earlier.
> 
> MFC's COleDocument::OnOpenDocument() opens files with the 
> SHARE_EXCLUSIVE flag.  Here's a code snippet from mfc\src\oledoc1.cpp
> 
>    else
>    {
>     // open new storage file
>     sc = StgOpenStorage(lpsz, NULL, 
>         STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_EXCLUSIVE, 
>         0, 0, &lpStorage);
> 
>     if (FAILED(sc) || lpStorage == NULL)
>      sc = StgOpenStorage(lpsz, NULL,
>          STGM_READ|STGM_TRANSACTED|STGM_SHARE_DENY_WRITE,
>          0, 0, &lpStorage);
>    }
>    if (FAILED(sc))
>     AfxThrowOleException(sc);
> 
>    ASSERT(lpStorage != NULL);
>    m_lpRootStg = lpStorage;
> 
> I'ld really like MFC to open the document as STGM_READWRITE |
> STGM_TRANSACTED | STGM_SHARE_DENY_WRITE.  That way, I could have 
> multiple readers of the document but only one writer.  Problem is, 
> there is no clean way (that I can see) to have this happen.  I could 
> override COleDocument::OnOpenDocument() but I'ld have to check my 
> code against every new version of MFC that comes out and it assumes 
> that the source code reflects what is actually in the binary.  I 
> really think MFC blew it on this one.  Why would they not open the 
> doc SHARE_DENY_WRITE by default?  Is there a way to work around this?




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