VC++编程问题二则

Author: 邹伸 Date: 1999年 第2期 13版

#1    问题1: 
    用一个软件打开一已存在的文件以供读写,发现有如下怪现象,对于大多数文件都能正确操作,但对于少部分文件提示非法操作,尤其是HTML文件都出错,严重时甚至会死机,当时程序为:
    pFile.Open(lpszPathName,CFile::modeReadWrite,&exception)
    后来在调试中发现文件在打开时exception有异常,想到HTML文件大多是只读文件,将modeReadWrite改为modeRead后问题就解决了(或先修改属性再打开)。
#1    问题2: 
    这个问题比较怪一点,先将一字串读入CString对象中,用GetBuffer(GetBufferLength())返回缓冲区长度后与取得的字模相乘,送入SetScrollSizes()函数中重新设定文档大小(重载OnUpdate()函数),发现有时打开文档会出错,且该错误不能被忽略。后来在查阅资料时,发现有些文献上用(-1)去乘返回的字模(debug时,字模乘以字数有时的确是一个负数),我试以(-1)相乘,仍不能解决问题。但发现SetScrollSizes()第一个参数的.cx和.cy的值有时很大,甚至达到了9位十进制数,这使我想到是否是因为数字太大而引起错误。结果不出所料,在CSize或SIZE中.cx和.cy都是整型数(int型),我代入一个带符号的整形数进行测试,发现.cx最大只能为32767(01111111b高8位),而.cy的值却可以大于32767,特别是.cy的上限被超过时,程序并不会报错,仅仅是不能滚动到文件末(近三千行),所以常被忽略(一般文档不会超过五百行)。