能同时打开两个复合文档吗?

时间:2021-03-28 11:52:36
我的程序中存在如下一段代码:
        if(::StgOpenStorage(T2COLE(g_szSt1), NULL,
                    STGM_READ|STGM_SHARE_EXCLUSIVE,
            NULL, 0, &pSt1) == S_OK) {
ASSERT(pSt1!= NULL);
}
if(::StgOpenStorage(T2COLE(g_szSt2), NULL,
                    STGM_READ|STGM_SHARE_EXCLUSIVE,
            NULL, 0, &pSt2) == S_OK) {
ASSERT(pSt2!= NULL);
}
执行后pSt1的值正确,而pSt2的值为0x00000000,但是ASSERT(pSt2!= NULL)并不
报错。
当执行下面的语句时出现错误:Unhandled exception in converge.exe:
0xC00000005:Access Violation
if(pStg2->EnumElements(0, NULL, 0, &pEnum2) != NOERROR) {
      ASSERT(FALSE);
}.
这是什么原因?是不是不能同时打开两个复合文档呢?

4 个解决方案

#1


你的程序写法有一点问题,为什么要判断打开成功以后再ASSERT呢?而且直接把返回值跟S_OK比较是不正确的,应该使用FAILED宏.

HRESULT hr = ::StgOpenStorage(T2COLE(g_szSt1), NULL,
                    STGM_READ¦STGM_SHARE_EXCLUSIVE,NULL, 0, &pSt1);
if(FAILED(hr))
     return hr;  //失败返回
.....

另外,同时打开两个复合文件不会有问题,请检查第二次执行StgOpenStorage的返回值.

#2


我修改了程序,结果出现的错误信息为:0x00000000内存不能为读。
返回hr的值为0x80030020,原因是"A lock violation has occurred."
请问这是为什么啊?

#3


我又查了一下msdn,StgOpenStorage()有一个返回值STG_E_LOCKVIOLATION:access denied
because another caller has the file open and locked.
仔细查了一下才发现自己竟然用DocFile打开了该复合文档。
关了以后,一切问题都解决了!

#4


看Q184663 msdn

#1


你的程序写法有一点问题,为什么要判断打开成功以后再ASSERT呢?而且直接把返回值跟S_OK比较是不正确的,应该使用FAILED宏.

HRESULT hr = ::StgOpenStorage(T2COLE(g_szSt1), NULL,
                    STGM_READ¦STGM_SHARE_EXCLUSIVE,NULL, 0, &pSt1);
if(FAILED(hr))
     return hr;  //失败返回
.....

另外,同时打开两个复合文件不会有问题,请检查第二次执行StgOpenStorage的返回值.

#2


我修改了程序,结果出现的错误信息为:0x00000000内存不能为读。
返回hr的值为0x80030020,原因是"A lock violation has occurred."
请问这是为什么啊?

#3


我又查了一下msdn,StgOpenStorage()有一个返回值STG_E_LOCKVIOLATION:access denied
because another caller has the file open and locked.
仔细查了一下才发现自己竟然用DocFile打开了该复合文档。
关了以后,一切问题都解决了!

#4


看Q184663 msdn