不知是个好主意还是馊主意,关于DLL、COM组件的引用计数问题。详情......(100分)

  • 主题发起人 主题发起人 yukuang
  • 开始时间 开始时间
Y

yukuang

Unregistered / Unconfirmed
GUEST, unregistred user!
见书上说DLL/COM组件都是采用引用计数,且代码在内存中只存在一份。
我想在程序设计中采用只load不free的方法,因为load一次无非是增加
了引用计数。我是想使它常驻内存,而减少下一个客户load的时间。不
知这样是否可行?
 
可以是可以,但这样。。内存。。何必!
 
DELPHI自动调用_addRef和_Release进行引用计数的处理,我个人认为没必要人工干预.
 
我是不想让它的引数计数为0而自行释放掉
 
只要重载__addRef和_Release即可避开引数计数
如Tmyclass=class(Tinterfacedobject,IUnknown)
; protected
; ; ;function _AddRef:integer;stdcall;
; ; ;function _Release:integer;stdcall;
;...
;function Tmyclass._AddRef:integer;
;begin
; ; ;rusult:=-1;
;end;
;function Tmyclass._Release:integer;
;begin
; ; ;rusult:=-1;
;end;
;_addref和_Release函数在Tinterfacedobject不是虚函数,如果在基类中是虚函数,加
;override指令.
 
這問題有點不太明瞭的地方,
這component是state or stateless,如果這component需要keep state,你會遇到大麻煩.
如果不需要keep state,由問題看來,不想把component release掉,無非是為了performance
issue.如果這元件程式運行由你控制,生死由你決定.只要保留一個object reference在
程式內,它就不會被release掉.如果是想把reference count由你控制不把它變成0,有點怪.
應該由COM的精神出發,保留一個 object reference.因為COM的好處就是它會幫你管理.
不過這機制在.NET已經被GC(garbage collection)接手了.
如果這元件由MTS or IIS控制,你大概無法控制.但如果是IIS5,檢查一下選項,看看有沒有
可以keep在memory的選項,不過我很懷疑,因為它違反COM的精神.
對不起,好像沒解決你的問題.
 
如果你不想它自己FREE,你可以增加一个计数,到需要的时候再减少这个计数,这个时候,
COM库就会配合COM对象将其Free了。否则的话,COM会自己管理引用计数的。
 
多人接受答案了。
 
后退
顶部