Symbian R-class

Symbian中的类经常分为C类,T类,R类,M类,就是分别以C/T/R/M开头的类名。

R类的"R"Resource的第一个字母,资源类。

具有"R"前缀的类表示某个资源的客户端句柄。应用程序实际上并不拥有资源,资源由设备上一个Symbian OS 服务器所拥有,服务器管理资源的使用。客户可以使用这些句柄访问服务器管理的资源,并请求使用它的功能。
R类没有任何公共的基类,有些分块的派系类,比如,有些类是从RHandleBase派生—RFs,而有的什么都不 —RWindow等。一般来说,R类是在栈上实例化或是嵌套在C类中,然后通过某种方式打开他们(通常通过一个方法调用来打开,例如调用Open() Connect())。结束使用它们时,有必要使用适当的方法来处理这些类(通常使用Close()函数)。如果在完成这项工作时失败,则R类所连接的服 务器内存和其他资源泄漏。
 Symbian 里的R类到底是啥?基本上所有R类都包含一个指向kernel-side objecthandle,这个handle是一个整数!通过这个整数,在DObjectIx这个容器中可以索引到R类指向的对象,这些对象都是从DObject派生出来的,具有引用计数的功能!当user-sideR类调用Close方法后,对应的计 数减1,到0时,就会自动析构内核的对象。

那么内核是如何把一个
handle32位整数解析成一个指向内核对象的指针的呢?
struct SDObjectIxRec
{
TInt16 instance;
TInt16 uniqueID;
DObject* obj;
};
这些指针通过SDObjectIxRec包装,放到DObjectIx的数组中,每一个DProcess或者DThread都有一个这样一个数组!(所以,当你创建一个R类的时候需要你指明是thread范围的还是process范围的,他们会被放到不同的地方)。
1.根据bit30看这个handle是存在thread里还是processDObjectIx
2.根据这个handle的bit0-14来判断这个handle真的在DObjectIx里,数组不越界
3.根据bit0-14获取这个index对应的SDObjectIxRec
4.根据bit16-29和获得SDObjectIxRecinstance比对
5.如果一致就无措,这些操作可能会需要NKern::LockSystem()
6.获得SDObjectIxRecobj指针

posted on 2010-05-26 21:46  魏方  阅读(270)  评论(0编辑  收藏  举报

导航