[问题] 64位元程式使用32位元程式资料

楼主: asdfg1597860 (Jay)   2018-12-24 11:29:39
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Visual Studio2015
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
MFC
问题(Question):
小弟我目前要在64位元程式接收32位元程式产出的档案
64及32程式都使用同一个dll(不过一个是32位元 一个是64位元)
https://imgur.com/a/bzvtkOb (sgFloat看做double)
在32位元程式写入档案
CFile fp;
fp.Open(sPath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
CArchive ar(&fp, CArchive::store);
CRule* pData = new CRule();
sgCMatrix* psgTemp;
psgTemp = new sgCMatrix();
psgTemp->SetMatrix(&g_tMatrix); //sgCMatrix g_tMatrix 宣告在其他cpp上、运算
pData->m_tMatrix = (void*) psgTemp; //void* m_tMatrix 宣告在CRule
ar.Write(pData->m_tMatrix, sizeof(sgCMatrix)); //sizeof(sgMatrix) 为132byte
在64位元程式读档
CFile fp;
fp.Open(sPath,CFile::modeRead|CFile::typeBinary);
CArchive ar(&fp, CArchive::load);
CRule* pData = new CRule();
sgCMatrix* psgTemp;
psgTemp = new sgCMatrix();
ar.Read((void*) psgTemp, sizeof(sgCMatrix)); //sizeof(sgMatrix) 为136byte
pData->m_tMatrix = (void*) psgTemp;
因为指标的差异所以内存上大小有差所以资料会错误
目前有两个做法
1.把读档的sizeof(sgMatrix )直接改成132
读资料时不会错误,但psgTemp里该写入136只写132 后续是否产生错误
2.把32位元的程式升级到64位元
需将之前建好的档案重建,但32位元建档步骤很多,全部重建需花很多时间
3.在32位元程式写档时写入136byte
不过sgMatrix 不是自己写, 所以结构无法改
请各位前辈赐教
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
补充说明(Supplement):
作者: LPH66 (-6.2598534e+18f)   2018-12-24 14:46:00
这应该不是指标问题, 而是 sgMatrix 这个结构的问题这个结构是你的吗? 还是什么函式库的?OK, 那这样一来你不应该直接写入一整个结构你应该要找这个结构的函式库里有没有序列化(serialization)的函数, 没有的话你要自己设法取出足够重建原物件的资讯一般来说有 private 成员的 class 不能直接这样写入另外有指标的结构也是不能直接这样写入的我不是在问 Dialog 的序列化, 而是问 sgCMatrix 的你的问题就只是需要储存一个 sgCMatrix 稍后能取出来
作者: TeaEEE (爱不趴 不爱趴)   2018-12-25 14:44:00
sizeof(sgMatrix)在x64的size应该多了4bytes.
作者: LPH66 (-6.2598534e+18f)   2018-12-25 15:01:00
多当然是有多, 但问题是多的是什么这里多的如原 PO 所观察是指标大小改变但这里就有一个问题是直接把指标值存进档案这件事是错的所以我才会说应该要去找序列化的函数而不是直接整块读写

Links booklink

Contact Us: admin [ a t ] ucptt.com