正在维护一个VC++ atlmfc的一个小工具,最近读取超过2G的大文件,会报存储空间不足的问题
shared_ptr<CAtlFileMapping<>> spFileMapping hr = spFileMapping->MapFile(file);//如果file的size超过2G就会储空间不足,无法处理此命令的问题,跟踪代码发现问题处在下面的代码,atlfile.h文件中的580行 m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL); if (m_pData == NULL) { HRESULT hr; hr = AtlHresultFromLastError(); ::CloseHandle(m_hMapping); m_hMapping = NULL; return hr; } //m_pData == NULL就返回了 AtlHresultFromLastError(),就是储空间不足,无法处理此命令的错误
baidu+google了一下,说项目解决方案平台是WIN32的时候,加载的文件大小不能2G,需要把解决方案平台改成X64的,但是如下图:
平台里没有X64的选项,在第一栏里点击新建,选择X64,点击确定的时候,会提示如下:
确定不了,为什么呢?
项目结构如下:
那个外部依赖链接的是 VS安装目录\vs\VC\atlmfc\include里的文件,
PC操作系统配置:
请高人指点啊!
选择“新建”,然后在“新建平台”下选“x64”。
你看下出错时 m_nMappingSize 是多大?
出错时你的内存剩余多少可用?
是要新建一个X64的atl项目吗?不会弄啊,有没有简单的方法把原始项目改成X64的?
@mrhyher: 这就是最简单的方法啊!你看你的截图,下拉列表不是有三项吗?win32 新建 编辑,选择新建。点一下鼠标很复杂吗?
@Launcher: 新建是有X64,但是确定的时候提示如下:
@mrhyher: 忘了贴在问题里了
@mrhyher: 把“创建新的解决方案平台”的勾去掉
@Launcher: 大神,把“创建新的解决方案平台”的勾去掉确实能改成X64了,但是问题依旧啊!看来这么着无法解决问题啊!
@mrhyher:同意新建。x86貌似最大识别到2G。 新建平台如果还有问题,看看你代码里是不是有问题,x64项目貌似有的代码是不一样的。比如指针变量神马的。
@mrhyher: 你把 m_pData 的值截图出来看看
@mrhyher: http://www.cnblogs.com/rainbowzc/archive/2013/02/20/2919760.html 软件移植:从win32到x64 .(转)
@Launcher:
全部改成X64成功了,但是运行的时候,提示COM组件“没有注册类”,win32情况下是没问题了。
@小刺猬001: 图片全看不见,不知道修改哪里啊
@mrhyher: 你看你的截图,x64 显示的指针地址应该为 0x0000000000000000,你的明显还是在x86模式下,其实你打开任务管理器,找到你的进程,如果在你的进程名字后面有 “*32”,那么你的程序就是运行在 32 位模式下,否则才是 64 位。
我只能说,你的程序应该使用了 COM 组件(根据你前一个帖子,我猜测是个串口通讯的组件),而使用的 COM 组件是 32 位的,因此你要么安装 64 位的 COM 组件,要么你需要自己实现 CAtlFileMapping ,你实现的 CAtlFileMapping 只需要增加一个新的功能,就是在目标文件大于 2GB 时给目标文件按照小于 2GB 的大小分段,MapViewOfFileEx 每次只 Map 小于 2GB 的地址空间。
@Launcher: 大神说的对啊!COM组件是用IDL写的,在MIDL里把目标环境改成X64的了,现在CoCreateInstance(__uuidof(一个struct)),提示没有注册类。
@mrhyher: 先注册
厄,貌似那文章的图确实看不到。你自己搜搜类似的文章很多。 祝早日解决~