起因是我在ocx中封裝了一個 richedit2.0 控件,并自己寫了一個
用于顯示圖片
ole 對象 。在我的ocx中插入大量的ole對象,大約3000個,然后保存為rtf。再使用我的ocx控件打開這個rtf時,會提示 內存不足。跟蹤代碼時發現在我實現的 IRichEditOleCallback 接口的 GetNewStorage(LPSTORAGE* lplpstg) 中報錯。
我的程序中創建 IStorage的思路是,在 IRichEditOleCallback 接口初始化時調用 StgCreateDocfile 創建一個根 Istorage,以后每個對象插入的時候 IRichEditOleCallback 的 GetNewStorage 接口被調用,在
GetNewStorage
方法中 在 根 Istorage 下建立一個subStroage。
HRESULT hResult = ::StgCreateDocfile(NULL,STGM_TRANSACTED|STGM_READWRITE | STGM_SHARE_EXCLUSIVE |STGM_CREATE ,
0, &m_pStorage );
//建立一個sub storage
WCHAR tName[50] = {0};
swprintf(tName, L"substorage%d", m_iNumStorages);
HRESULT hResult = pStorage->CreateStorage(tName,
STGM_TRANSACTED|STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE ,
0, 0, lplpstg );
后來發現 把 STGM_TRANSACTED 標識去掉就可以了。有點莫名其妙,估計是事務的處理會導致內存的占用增加的緣故吧。
另外 在msdn 中 搜索 STGM ,注意紅色的字體,也就是收 使用com中的 IStorage 接口,是不能創建具有 STGM_TRANSACTED 表示的 IStream對象的
- STGM_TRANSACTED
- In transacted mode, changes are buffered and written only if an explicit
commit operation is called. To ignore the changes, call the Revert method
in the IStream, IStorage, or IPropertyStorage interface.
The COM compound file implementation of IStorage does not support
transacted streams, which means that streams can be opened only in direct mode,
and you cannot revert changes to them, however transacted storages are
supported. The compound file, stand-alone, and NTFS file system implementations
of IPropertySetStorage similarly do not support transacted, simple
property sets because these property sets are stored in streams. However,
transactioning of nonsimple property sets, which can be created by specifying
the PROPSETFLAG_NONSIMPLE flag in the grfFlags parameter of
IPropertySetStorage::Create, are supported.