CStringArray MFC 32 位序列化和 64 位反序列化

问题描述 投票:0回答:1

我在将 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 之间很好。

serialization mfc 32bit-64bit porting
1个回答
0
投票

我为未来的读者回答我的问题。问题与 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.

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.