首页 新闻 会员 周边

VS2010无法将atlmfc项目的解决方案平台设置成X64

0
悬赏园豆:100 [已解决问题] 解决于 2016-04-21 19:47

正在维护一个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操作系统配置:

请高人指点啊!

mrhyher的主页 mrhyher | 初学一级 | 园豆:5
提问于:2016-03-28 09:49
< >
分享
最佳答案
1

 

选择“新建”,然后在“新建平台”下选“x64”。

你看下出错时 m_nMappingSize 是多大?

出错时你的内存剩余多少可用?

收获园豆:100
Launcher | 高人七级 |园豆:45045 | 2016-03-28 10:15

是要新建一个X64的atl项目吗?不会弄啊,有没有简单的方法把原始项目改成X64的?

mrhyher | 园豆:5 (初学一级) | 2016-03-28 10:45

@mrhyher: 这就是最简单的方法啊!你看你的截图,下拉列表不是有三项吗?win32 新建 编辑,选择新建。点一下鼠标很复杂吗?

Launcher | 园豆:45045 (高人七级) | 2016-03-28 10:52

@Launcher: 新建是有X64,但是确定的时候提示如下:

mrhyher | 园豆:5 (初学一级) | 2016-03-28 11:06

@mrhyher: 忘了贴在问题里了

mrhyher | 园豆:5 (初学一级) | 2016-03-28 11:07

@mrhyher: 把“创建新的解决方案平台”的勾去掉

Launcher | 园豆:45045 (高人七级) | 2016-03-28 11:47

@Launcher: 大神,把“创建新的解决方案平台”的勾去掉确实能改成X64了,但是问题依旧啊!看来这么着无法解决问题啊!

mrhyher | 园豆:5 (初学一级) | 2016-03-28 14:39

@mrhyher:同意新建。x86貌似最大识别到2G。 新建平台如果还有问题,看看你代码里是不是有问题,x64项目貌似有的代码是不一样的。比如指针变量神马的。 

小刺猬001 | 园豆:660 (小虾三级) | 2016-03-28 14:49

@mrhyher: 你把 m_pData 的值截图出来看看

Launcher | 园豆:45045 (高人七级) | 2016-03-28 14:54

@mrhyher: http://www.cnblogs.com/rainbowzc/archive/2013/02/20/2919760.html  软件移植:从win32到x64 .(转)

小刺猬001 | 园豆:660 (小虾三级) | 2016-03-28 14:56

@Launcher: 

全部改成X64成功了,但是运行的时候,提示COM组件“没有注册类”,win32情况下是没问题了。

mrhyher | 园豆:5 (初学一级) | 2016-03-28 17:43

@小刺猬001: 图片全看不见,不知道修改哪里啊

mrhyher | 园豆:5 (初学一级) | 2016-03-28 17:43

@mrhyher: 你看你的截图,x64 显示的指针地址应该为 0x0000000000000000,你的明显还是在x86模式下,其实你打开任务管理器,找到你的进程,如果在你的进程名字后面有 “*32”,那么你的程序就是运行在 32 位模式下,否则才是 64 位。

 

我只能说,你的程序应该使用了 COM 组件(根据你前一个帖子,我猜测是个串口通讯的组件),而使用的 COM 组件是 32 位的,因此你要么安装 64 位的 COM 组件,要么你需要自己实现 CAtlFileMapping ,你实现的 CAtlFileMapping 只需要增加一个新的功能,就是在目标文件大于 2GB 时给目标文件按照小于 2GB 的大小分段,MapViewOfFileEx 每次只 Map 小于 2GB 的地址空间。

Launcher | 园豆:45045 (高人七级) | 2016-03-28 18:01

@Launcher: 大神说的对啊!COM组件是用IDL写的,在MIDL里把目标环境改成X64的了,现在CoCreateInstance(__uuidof(一个struct)),提示没有注册类。

mrhyher | 园豆:5 (初学一级) | 2016-03-29 14:00

@mrhyher: 先注册

Launcher | 园豆:45045 (高人七级) | 2016-03-29 15:30
其他回答(1)
0

厄,貌似那文章的图确实看不到。你自己搜搜类似的文章很多。  祝早日解决~

小刺猬001 | 园豆:660 (小虾三级) | 2016-03-29 09:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册