WEB开发网
开发学院手机开发Symbian 开发 Symbian开发入门 阅读

Symbian开发入门

 2010-06-03 23:07:00 来源:WEB开发网   
核心提示:另外一个比较微妙问题是,当您分配一个HBufC以后,Symbian开发入门(19),然后在它上面调用Des(),可以返回一个TPtr对象,TBuf是16bit宽度的), 所以,无论文件名的长度为多少,HBufC* buf = HBufC::NewL(9);TPtr p = buf->Des();可是,假如您回忆一

另外一个比较微妙问题是,当您分配一个HBufC以后,然后在它上面调用Des(),可以返回一个TPtr对象。

HBufC* buf = HBufC::NewL(9);

TPtr p = buf->Des();

可是,假如您回忆一下,可以知道在HBufC中,并没有一个字(word)用来保存最大长度的信息------因为HBufC是不可修改的(non- modifiable),它不需要最大长度的信息。然而,,TPtr需要这个最大长度的信息,这时问题来了,您从哪里得到这个最大长度呢?答案在于:当您调用Des()的时候,系统用HBufC的最大长度来设置TPtr的最大长度(iMaxLength)。

在这个例子中,buf的最大长度是多少呢?它是9吗?答案是不一定。堆描述符的最大长度有可能并不是您所期望的值(在这个例子中为9)。这是由于您并没有指定一个字对齐(word-aligned)的最大长度,所以最后的实际的长度可能比您所指定的长度要大一些(但我们不能确定这个值到底是多少)。

_LIT(KPanic, "TestPointer");

const TInt KBufferLength = 9;

void TestPointer()

{ // Create a buffer with length KBufferLength = 9 bytes

HBufC8* myBuffer = HBufC8::NewMaxL(KBufferLength);

TPtr8 myPtr(myBuffer->Des());

TInt len = myPtr.Length(); //len的值为0

TInt maxLen = myPtr.MaxLength(); //得到一个比KBufferLength稍大数,并不固定

myPtr.SetLength(KBufferLength); //或myPtr.SetMax();否则下面的语句不起作用

myPtr.Fill(’?’); // 用’?’填充描述符

char* ptr = (char*)myPtr.Ptr();//确保已经调用了SetLength()或SetMax()方法。

ptr[0] = 'x';

HBufC8* buf = HBufC8::NewLC(9);

TPtr8 ptr(buf->Des());

TInt maxLength = ptr.MaxLength(); // maxLength比9大,但不一定等于12(字的边界)

3.11 TFileName的滥用

对TFileName 对象的滥用是一个潜在的危险。TFileName是在文件 e32std.H中定义的:

const TInt KMaxFileName=0x100; // = 256 (decimal)

typedef TBuf TFileName;

由于每个宽字符相当于两个字节(前面说过,默认情况下,TBuf是16bit宽度的), 所以,无论文件名的长度为多少,每次您在栈上创建一个 TFileName 对象的时候都消耗了524 个字节 (2 × 256 描述符数据字节 + 描述符本身的12字节)。在Symbian

上一页  14 15 16 17 18 19 20 21  下一页

Tags:Symbian 开发 入门

编辑录入:coldstar [复制链接] [打 印]
赞助商链接