ACTIVEX控件永久化的一些经验

  最近,完成了一个和QQ一样的能显示动态表情的ACTIVEX控件,效果还不错,和QQ的控件相比,也可以插入到RICHEDIT中,并且不闪烁(QQ的会闪烁),效率也比QQ的高。就拿QQ那个流泪的表情来说吧,同一张图片,在我的电脑上,我的控件能在RICHEDIT中插入49张,而QQ的插到30张CPU占用率就到100%了。当时觉得很高兴,但是也有不足,QQ的控件在RICHEDIT中可以实现复制粘贴,我的还不行,怎么办,是不是要实现控件的IDataObject接口啊,呵,不一定,通过实现永久化接口也可以实现,什么原因?不好意思,我也不懂,我自己瞎猜碰上的,可能是上天看我可怜帮我一把吧。

  什么是实现永久化呢?简单的说,就是把控件的状态保存起来,下次用的时候再生成一个控件并从原来的库存中读出控件的状态并恢复而已。控件的状态用什么来表示的呢,基本上就是一些属性啦,当然,这个属性是一个广义的属性了,包括COM库规定的固有属性,COM开发者自己定义的属性,还有用户添加的所以影响到控件状态的成员变量。从上面的话,可以看出,控件的永久化至少包括两部分,一是保存,二是读取,就是我们平时说的SAVE和LOAD。下面将简单说下这两方面。

  首先说SAVE,SAVE的时候,我们要决定什么要SAVE,什么不要。一些COM固有的属性是要保存的,比如说版本,控件申缩状态(m_sizeExtent),使能属性(enable),这些固有的好说,直接WRITE出去就行了。往往影响我们控件状态的是COM组件开发者自己定义的属性,比如一个控件用一张图片来做背景,图片的文件的路径就就要保存了,还有,如果你的控件有一个数组,那数组元素当然要保存了。但是,如果控件成员变量里有指针怎么办?别担心,指针不用管它,因为指针代表的只是一个地址,而这个地址只是进程内的相对地址,与进程是密切相关的。如果你保存了这个地址,并且控件被销毁了,下次再运行程序的时候,再使用那个被保存过的指针代表的地址就会出错了,因为这地址是对于现在这个新的进程的,这时它可能什么都不是,是一个野指针,野指针是不能随便乱用的,嘿嘿。既然指针不保存,我们又要用到它,怎么办啊?呵,很简单啊,再NEW出来就行了,在什么时候NEW啊,那是LOAD的事咯。

  现在来说说LOAD,很简单了,LOAD只是把SAVE出去的状态LOAD出来而已,对于指针变量,我们就NEW出来,就这么单位的。

  注意了现在说注意事项,就是LOAD的时候,我们的变量LOAD的顺序要和SAVE的顺序相同,就是说,我们先SAVE哪个属性,就应该先LOAD哪个属性,不能乱。

  到现在为止,我只说了基本属性的永久化,其实永久化还有很多东西要实现,比如说控件的属性页怎么保存啊。不好意思了,这个我也没有做过,慢慢学习吧,我也是COM菜鸟。

你可能感兴趣的:(qq)