3137|9

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

文件访问出错,该怎么解决阿? [复制链接]

在windlows Mobile 平台上作了一个操作文件的程序。文件是以可读写方式打开的,对其进行了一次读写操作后,在进行写操作就会出错。用GetLastError调出错误原因显示“访问被拒绝”,检查文件指针没有发现未释放的文件指针。现在不知道该怎么解决,请高手予以指点,在下不胜感激!

最新回复

上面的解释也不全对,刚才又对该函数进行了一下较深入的研究发现,最重要的问题是出在类型转换的时候。 LPDWORD的定义如下: typedef DWORD *LPDWORD; 这样的话 (LPDWORD)writelen 就相当于(DWORD *)writelen 也就是说,我把writelen的值强制转换成了地址,而在这个地址对应的内存中读出数据进行下一步操作。 但是,大家都知道计算机的0x00000000到0x00010000这一段地址对应的内存是受系统保护的,用户没有任何操作权限。 而byte型的数据转换成地址所对应的内存正好在这一段内存中,所以要对其进行读写操作就会出错。   详情 回复 发表于 2008-7-31 14:58
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
把代码贴出来,只这样描述没有办法解决问题的。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
如果你的代码是正确的,应该不会这样。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
BOOL ReadPasswd( byte *password)
{
        HANDLE  hFile           = INVALID_HANDLE_VALUE;
        DWORD        NumberOfBytesWritten = KEY_LEN;
        DWORD        sizeLow = 0;
        DWORD        NumberOfBytesRead=KEY_LEN;
        byte initpsd[KEY_LEN]; ///定义初始密码


        //        memset(m_readResultTemp,0,readBytes);  

        //打开已有的文件。
        hFile = CreateFile(TEXT("My Documents\\key.txt"),GENERIC_WRITE|GENERIC_READ,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL);

        memcpy(initpsd,"123456780000",KEY_LEN);

        //文件不存在,则创建初始文件,并向初始文件中写入初始数据。
        if (INVALID_HANDLE_VALUE == hFile)
        {               
                hFile = CreateFile(TEXT("My Documents\\key.txt"),GENERIC_WRITE|GENERIC_READ,0, NULL, CREATE_NEW, FILE_ATTRIBUTE_HIDDEN, NULL);
                memcpy(initpsd,"123456780000",KEY_LEN);
                memcpy(password,initpsd,KEY_LEN);

                //数据加密
                encrypt( TRUE, password, KEY_LEN );
                encrypt( TRUE, (byte*)&ChangePassword, 1); //2008.7.17

                //写入到文件
                if( FALSE==WriteFile(hFile, password, NumberOfBytesWritten, &NumberOfBytesWritten, NULL) )
                {
                        CloseHandle(hFile);
                        return FALSE;
                }
                NumberOfBytesWritten=1;//2008.7.17
                if( FALSE==WriteFile(hFile, &ChangePassword, NumberOfBytesWritten, &NumberOfBytesWritten, NULL) )//2008.7.17
                {
                        CloseHandle(hFile);
                        return FALSE;
                }
                if( FALSE==WriteFile(hFile, &number, NumberOfBytesWritten, &NumberOfBytesWritten, NULL) )//2008.7.17
                {
                        CloseHandle(hFile);
                        return FALSE;
                }
        }

        //读取文件中的数据。
        //        SetFilePointer(hFile,beginPointByteNum,NULL,FILE_BEGIN);
        ChangePassword=false;
        if(FALSE == ReadFile(hFile,password,KEY_LEN,&NumberOfBytesRead,NULL))
        {
                //操作失败。
                CloseHandle(hFile);
                return FALSE;
        }
        NumberOfBytesRead=1;//2008.7.17
        if(FALSE == ReadFile(hFile,&ChangePassword,NumberOfBytesRead,&NumberOfBytesRead,NULL))   //2008.7.17
        {
                //操作失败。
                CloseHandle(hFile);
                return FALSE;
        }
        if(FALSE == ReadFile(hFile,&number,NumberOfBytesRead,&NumberOfBytesRead,NULL))   //2008.7.17
        {
                //操作失败。
                CloseHandle(hFile);
                return FALSE;
        }

        //解密读出的数据
        encrypt( TRUE, password, KEY_LEN );
        encrypt( TRUE, (byte *)&ChangePassword, 1 ); //2008.7.17


        //关闭文件句柄。
        CloseHandle(hFile);
        hFile = INVALID_HANDLE_VALUE;
        return TRUE;
}

BOOL WriteKey( byte *write, const byte writeposition, const byte writelen ) //2008.7.17
{
        HANDLE hFile = INVALID_HANDLE_VALUE;
        WORD error;

        //打开已有文件
        hFile = CreateFile(TEXT("My Documents\\key.txt"),GENERIC_WRITE|GENERIC_READ,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL);

        //打开失败,直接返回
        if( hFile == INVALID_HANDLE_VALUE )
        {
                CloseHandle(hFile);
                return FALSE;
        }

        //将文件指针移动到要操作的位置
        SetFilePointer(hFile,writeposition,NULL,FILE_BEGIN);


        //写入数据失败,直接返回
        if( FALSE==WriteFile( hFile, write, writelen, (LPDWORD)writelen, NULL) )
        {
                //出错检查
                /*error=GetLastError();*/
                LPVOID lpMsgBuf;
                FormatMessage(
                        FORMAT_MESSAGE_ALLOCATE_BUFFER |
                        FORMAT_MESSAGE_FROM_SYSTEM |
                        FORMAT_MESSAGE_IGNORE_INSERTS,
                        NULL,
                        GetLastError(),
                        0, // Default language
                        (LPTSTR) &lpMsgBuf,
                        0,
                        NULL
                        );
                // Process any inserts in lpMsgBuf.
                // ...
                // Display the string.
                MessageBox( NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_TOPMOST );
                // Free the buffer.
                LocalFree( lpMsgBuf );
                        /*error=GetLastError();*/

                CloseHandle(hFile);
                return FALSE;
        }

        //写入数据成功,返回
        CloseHandle(hFile);
        hFile = INVALID_HANDLE_VALUE;
        return TRUE;
}

BOOL ReadData( void *data,  const byte readposition, const byte len ) ///2008.7.21
{
        HANDLE hFile = INVALID_HANDLE_VALUE;

        //打开已有文件
        hFile = CreateFile(TEXT("My Documents\\key.txt"),GENERIC_WRITE|GENERIC_READ,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_HIDDEN, NULL);

        //打开文件失败,直接返回
        if( hFile == INVALID_HANDLE_VALUE )
        {
                CloseHandle( hFile );
                return FALSE;
        }

        //将文件指针移动到要操作的位置。
        SetFilePointer( hFile,readposition,NULL,FILE_BEGIN);

        //读文件数据
        if( FALSE==ReadFile( hFile, data, len, (LPDWORD)len, NULL) )
        {
                //读取数据失败,直接返回
                CloseHandle(hFile);
                return FALSE;
        }

        //操作完毕,返回
        CloseHandle(hFile);
        hFile = INVALID_HANDLE_VALUE;
        return TRUE;
}
 
 
 

回复

77

帖子

0

TA的资源

宇宙尘埃

5
 
这就是全部代码,按上面的顺序依次调用的。
调用了第一个函数后一切正常,调用第二个时,在打开文件的时候就报错了!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(中级)

6
 
找到错误原因了

BOOL WriteKey( byte *write, const byte writeposition, const byte writelen )
这个函数中的第三个参数 writelen 定义为byte 型。后面在传递给WriteFile 这个函数的第四个参数时使用强制类型转换,转化为DWOROD型的指针。就是这个转换导致出现了文件访问错误。

而至于为什么这个强制类型转换会导致文件访问错误,还需进一步的研究。
同时,希望高手能对这一问题予以解答。在此先行谢过了!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 

WriteFile( hFile, write, writelen, (LPDWORD)writelen, NULL) )

你的这个writelen的定义是 const byte writelen

const啊!!!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

8
 
楼上正确,第四个参数不能为常量,第四个参数的说明
lpNumberOfBytesWritten
[out] Pointer to the number of bytes written by this function call. WriteFile sets this value to zero before taking action or checking errors.
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

9
 
恭喜恭喜!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
上面的解释也不全对,刚才又对该函数进行了一下较深入的研究发现,最重要的问题是出在类型转换的时候。
LPDWORD的定义如下:
typedef DWORD *LPDWORD;
这样的话
(LPDWORD)writelen
就相当于(DWORD *)writelen
也就是说,我把writelen的值强制转换成了地址,而在这个地址对应的内存中读出数据进行下一步操作。
但是,大家都知道计算机的0x00000000到0x00010000这一段地址对应的内存是受系统保护的,用户没有任何操作权限。
而byte型的数据转换成地址所对应的内存正好在这一段内存中,所以要对其进行读写操作就会出错。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表