内存映射,拷贝内存数据出错,请高手指点

sosonokia 2007-12-10 08:48:56
在a工程里:
BOOL CCallDlg::CreateTextData(CString strData)
{
DWORD dsize = sizeof(strData);
HANDLE hdata = ::CreateFileMapping((HANDLE)0xffffffff,NULL,PAGE_READWRITE,0,dsize,"DataOne");
if(hdata == NULL)
{
this->MessageBox("create memory map file failed");
return false;
}

LPVOID lpdata = ::MapViewOfFile(hdata,FILE_MAP_READ|FILE_MAP_WRITE,0,0,dsize);
if(lpdata == NULL)
{
this->MessageBox("map View of file failed");
return false;
}

strcpy((char*)lpdata,(char*)&strData); ////如果拷贝大数据量,这个strcpy会出错,会是什么原因呢,使用
strcat,memmove也一样。。。

ASSERT(::UnmapViewOfFile(lpdata));

return true;
}

strcpy((char*)lpdata,(char*)&strData); ////如果拷贝大数据量,这个strcpy会出错,会是什么原因呢,使用
strcat,memmove也一样。。。
...全文
166 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
queshangxintou 2007-12-11
  • 打赏
  • 举报
回复
这里有个对Cstring的详细说明http://www.chinaitpower.com/A/2001-10-10/1307.html
lz可能用的时候有点问题
3m2u 2007-12-11
  • 打赏
  • 举报
回复
map的长度不能太大吧。
我觉得100M一次的map,一点一点拷贝就没问题了
楼主可以试试
queshangxintou 2007-12-11
  • 打赏
  • 举报
回复
楼主能不能说的更详细一点,大到多少出错了啊
有可能是溢出了
jameshooo 2007-12-11
  • 打赏
  • 举报
回复
谁说CString的长度不能超过260?只有文件路径的长度不能超过260(MAXPATH)。
CString能存储的最大字符个数是 INT_MAX (2,147,483,647)
fantasyemperor 2007-12-11
  • 打赏
  • 举报
回复
是CString的问题,长度好像是260,长了会有问题,最好用char* 然后数据new出来。
dirdirdir3 2007-12-11
  • 打赏
  • 举报
回复
CString 的字符容量有限,不能用在大数据量的地方,直接该为char *试试
zhoujianhei 2007-12-11
  • 打赏
  • 举报
回复
strcpy((char*)lpdata,(char*)&strData); ////如果拷贝大数据量,这个strcpy会出错,会是什么原因呢,使用
strcat,memmove也一样。。。
===============================================
直接赋值就可以了。
strData = (char*)lpdata;
sosonokia 2007-12-11
  • 打赏
  • 举报
回复
xuxingok : 直接在strcpy类的函数当掉。。。郁闷之极
xuxingok 2007-12-11
  • 打赏
  • 举报
回复
GetLastError()看看吧
knightshenbin 2007-12-11
  • 打赏
  • 举报
回复
strData其实你还没给他分配空间,默认的strData都是放到同一个位置,只有实际使用时候他才会分配空间。
小批量的也会错误的,只不过你还没发现而已。
return true; 之前你定义一个CString abc="";你的程序就出问题了。
sosonokia 2007-12-11
  • 打赏
  • 举报
回复
xuxingok :这些函数都有试过
xuxingok 2007-12-11
  • 打赏
  • 举报
回复
尽量使用安全类型函数,如:strncpy()、strncat()
sosonokia 2007-12-11
  • 打赏
  • 举报
回复
我在工程改了,之间赋值一个很大的数字

HANDLE hdata = ::CreateFileMapping((HANDLE)0xffffffff,NULL,PAGE_READWRITE,0,100000,"DataOne");

拷贝20000个字节的数字就会错。郁闷
xuxingok 2007-12-11
  • 打赏
  • 举报
回复
DWORD dsize = sizeof(strData);
这个。。。是个常数吧,sizeof(CString)=4吧,显然你怎么操作都会错了~
sosonokia 2007-12-10
  • 打赏
  • 举报
回复
我是lz, 谢谢楼上2位的回答!


CString strData
strcpy((char*)lpdata,strData); ////如果拷贝大数据量,这个strcpy会出错,会是什么原因呢,使用
strcat,memmove也一样。。。

小数据量是不会出错的。。。
dandycheung 2007-12-10
  • 打赏
  • 举报
回复
不好意思,上面的 GetLength() 应该加 1 后再乘 sizeof(TCHAR)。
dandycheung 2007-12-10
  • 打赏
  • 举报
回复
问题出在 DWORD dsize = sizeof(strData) 上,改成 DWORD dsize = sizeof(TCHAR) * strData.GetLength()。当然,同时要把 strcpy((char*)lpdata,(char*)&strData) 改成 lstrcpy((LPTSTR)lpdata,(LPCTSTR)strData)。
jameshooo 2007-12-10
  • 打赏
  • 举报
回复
还有,如果你的项目用UNICODE编译,就不能直接用strcpy了,因为LPCTSTR等效于const wchar_t*,必须做转换。
jameshooo 2007-12-10
  • 打赏
  • 举报
回复
用法错误,strData是CString类型,所以不应该使用取指符,应该这样用 strcpy((char*)lpdata, (LPCTSTR)strData);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧