使用StgOpenStorage以只读方式打开OLE复合文档

时间:2009-07-06 12:56:55

标签: windows winapi ole

我正在使用XP下的StgOpenStorage API来读取OLE化合物文档,但我无法找到正确的标志组合来告诉Windows我只需读取该文件而不会阻塞访问任何其他进程...
现在我正在使用STGM_READ | STGM_EXCLUSIVE,但显然如果我同时尝试从另一个应用程序打开该文件,它会抱怨被拒绝访问..所以我尝试了STGM_READ | STGM_SHARE_DENY_NONE 但它抱怨无效的旗帜..

有办法做到这一点吗?我走错路了吗?

提前致谢!

(我通过pythoncom从Python调用API,如果它是相关的)

1 个答案:

答案 0 :(得分:2)

这是猜测,但是来自StgOpenStorage API文档:

When the STGM_DIRECT flag is specified, only one of the following combination
of flags may be specified from the access and sharing groups.
  STGM_READ | STGM_SHARE_DENY_WRITE
  STGM_READWRITE | STGM_SHARE_EXCLUSIVE
  STGM_READ | STGM_PRIORITY
Be aware that direct mode is implied by the absence of STGM_TRANSACTED.
That is, if neither STGM_DIRECT nor STGM_TRANSACTED is specified, STGM_DIRECT
is assumed.

这表明将标志更改为

STGM_READ | STGM_SHARE_DENY_NONE | STGM_TRANSACTED

应该做你想做的事。这是有道理的:在“直接”模式下,如果有人可以开始写入存储,那么它们将覆盖我们正在阅读的内容。