我在将 MFC 应用程序从 32 位移植到 64 位时遇到了很多困难。 我和
CStringArray
成员有相同的课程,他们使用 CArchive
序列化,在 32 位应用程序中一切正常。
现在我将同一个应用程序分成两部分,一个是 32 位的,另一个是 64 位的,它们需要共享一些序列化数据;当我序列化一个
CStringArray
成员并尝试在 64 位应用程序中反序列化它时,我得到一个 CArchiveException
,原因 = 3 应该是“endOfFile
”。
目前还不清楚发生了什么,我怀疑由于大小原因我无法将其序列化为 32 位数据并在 64 位应用程序上读取它。如果我按照
GetSize()
的 CStringArray
函数,我看到返回是 INT_PTR
定义如下:
这意味着没有办法在 32 位上进行
CStringArray
序列化并在 64 位上进行反序列化?存在解决方法或类似的方法吗?在 32 和 64 应用程序之间,我应该检查其他 MFC 数据吗?
编辑:问题与 CStringArray 严格无关,(请参阅评论)在 32/64 之间很好。
我为未来的读者回答我的问题。问题与 CStringArray 无关,而是与它附近的代码的其他部分有关。问题是在 CStringArray obj 之前还有另一个成员是自定义结构的 CArray。这个结构有几个成员使用
CArchive SerializeElements
函数的覆盖来在 32 位中进行正确的数据序列化。
这个序列化元素是这样写的:
template<class TYPE> void AFXAPI SerializeElements (CArchive& ar, CRect* pElements, int nCount);
但是 64 位版本不使用此覆盖,因为最后一个参数是
int
而不是 INT_PTR
并且没有使用 SerializeElements,我进行了错误的序列化(所需的字节较少,这就是为什么我在阅读时很快到达 endOfFile 的原因).
要修复它,只需对 SerializeElements 使用正确的声明即可:
template<class TYPE> void AFXAPI SerializeElements (CArchive& ar, CRect* pElements, **INT_PTR** nCount);
注意int => INT_PTR.
希望对你有帮助