能力值:
( LV5,RANK:60 )
|
-
-
2 楼
分配内存 出错?你到底是程序崩溃了还是VirtualAlloc返回NULL还是什么呢?
pData[dwSize] = '\0'; 溢出操作,VirtualAlloc的时候记得是dwSize+1
而且你pWData 的末尾还木有'\0',小心
这样的代码太不强壮了
|
能力值:
( LV9,RANK:200 )
|
-
-
3 楼
崩溃了,RING3 不咋地呀。。。 pWData 最后由CString 转换了 不加也行
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
FileMapping ?
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
多线程安全么。
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
我说的关键是pData[dwSize] = '\0';这句,溢出操作了
而且我猜你应该至少得这么写
ReadFile(hFile, (LPVOID)pData, dwSize-1, &dwBytesRead, NULL);
pData[dwBytesRead] = '\0';
|
能力值:
( LV9,RANK:200 )
|
-
-
7 楼
不是这么写的问题 我上的那些代码都是我测试中更改后的,‘\0’我都加过,这就是个打开文本文件的,打开一般的文件都没有问题,就是打开一个超过2000行的文本出错了,用new 创建缓冲内存没事
LPSTR pData = (LPSTR)VirtualAlloc(NULL, dwSize+10, MEM_COMMIT, PAGE_READWRITE);
关键是这里你申请的内存 +10 也是错误
//LPSTR pData = new char[dwSize + 1];
LPSTR pData = (LPSTR)VirtualAlloc(NULL, dwSize + 1, MEM_COMMIT, PAGE_READWRITE);
ReadFile(hFile, (LPVOID)pData, dwSize, &dwBytesRead, NULL);
CloseHandle(hFile);
pData[dwSize] = '\0';
int wslen = ::MultiByteToWideChar(CP_ACP, 0, pData, dwSize, NULL, NULL);
//LPWSTR pWData = new WCHAR[wslen + 1];
LPWSTR pWData = (LPWSTR)VirtualAlloc(NULL, wslen + 1, MEM_COMMIT, PAGE_READWRITE);
pWData[wslen] = '\0';
MultiByteToWideChar(CP_ACP, 0, pData, dwSize, pWData, wslen);
上面注释的代码运行是正确的,我就是不明白 为什么用VirtualAlloc 分配会错误
|
能力值:
( LV5,RANK:60 )
|
-
-
8 楼
//LPWSTR pWData = new WCHAR[wslen + 1];
LPWSTR pWData = (LPWSTR)VirtualAlloc(NULL, wslen + 1, MEM_COMMIT, PAGE_READWRITE);
pWData[wslen] = '\0';又溢出了,哈哈。要VirtualAlloc(NULL, (wslen + 1)*2, …
|
能力值:
( LV5,RANK:60 )
|
-
-
9 楼
话说你崩溃的时候调试器不会 断在某个点吗?
难道你都不调试的?
|
能力值:
( LV9,RANK:200 )
|
-
-
10 楼
明白了 没想到 宽字符是*2的
谢谢了
|
能力值:
( LV9,RANK:200 )
|
-
-
11 楼
一直以为 int wslen = ::MultiByteToWideChar(CP_ACP, 0, pData, dwSize, NULL, NULL);得到的长度就是宽字符的长度
不过到现在还迷糊的是为什么打开小文件不报错呢
|
|
|