以上的问题我已经解决了。
我现在正在学习结构化存储,我回从现在开始把我遇到的问题发上来,解决问题的方法也发上来,这不仅使大家了解结构化存储有用,也对深入COM学习有帮助,感兴趣的朋友们也可以发表下自己的心得(我不知道我能不能说得清楚,我的表达能力很差,大家有不清楚的可以说出来,或者我说错了的)。
我先说说发生上述的问题吧。
RootStorage :IStorage;
接口是引用指针的计数,因此在对象中当获得接口指针时,对象被引用的次数就增加了。
引用计数是用IUnknown._AddRef和IUnknown._Release来控制的。
对于IStorage也是一样,我虽然已经RootStorage :=nil 但是IStorage的引用数并没有减少,因此我并没有打开原来子存储的读取权限,说的清楚点就是:我打开A,B,C,D的模式都有
STGM_EXCLUSIVE,这个模式的意思是不允许其他用户以读或写的方式打开,我虽然已经把引用A,B,C,D的RootStorage := nil,但是,一旦拥有了一个对象接口的引用,该对象就不能被撤消。对于IStorage来说,这个根或子存储的读写模式已经存在,不能再打开了,要使它放弃模式,有效的增加或结束引用可以解决我的上述问题,就要用到_AddRef和_Release,虽然Delphi在合适的时候自动调用了_AddRef和_Release,但是有些情况下我们还是必须要自己调手动用这两个函数的。
在写COM程序时,做了一翻努力,却得到了一个自己本来认为不该为nil的接口,或是出现“试图使用一个不复存在的对象”错误时候,也许就要查看自己对接口的引用了,也许调用这两个函数能解决您的问题