2011-08-01 56 views
0

我正在处理这个应用程序中的示例应用程序,我正在序列化一些数据。在客户端应用程序中,我正在读取序列化数据。在做这件事时我观察到一些奇怪的行为。内存填充问题

对象的示例应用程序大小与客户端中的数据大小不同。我认为这是因为内存填充。我的问题是我想写“BRUSHOBJ”文件。此结构由Microsoft定义。我可以改变这种结构的声明。请让我知道如何解决这个问题。

请让我知道如何在诽谤数据类型上应用内存填充。

回答

0

您通过的#pragma包

序列化数据有2个选项

  • 串行数据
  • 修改内存填充有内存填充没有关系,你只是定义方式将内存写入/读回内存位置(内存流)。

    我看到那个_BRUSHOBJ结构有如下定义,

    typedef struct _BRUSHOBJ { 
        ULONG iSolidColor; 
        PVOID pvRbrush; 
        FLONG flColorType; 
    } BRUSHOBJ; 
    

    请注意,发送跨进程的指针是nonsens。序列化指针应该通过写入内存大小和内存本身来完成。无论如何,如果你想将这个BRUSHOBJ传递给一个windows函数,你可能会得到未定义的行为。这不是一个支持/记录的跨BRUSHOBJ过程的方式。

    内存填充可以通过应用这样

    #pragma pack(push) 
    #pragma pack(4) 
    struct myStruct 
    { 
        char Char1 
        int Int1; 
    }; 
    #pragma pack(pop) 
    

    如果你有什么修改填充,你应该为DOIT是由您编写的结构。

3

听起来好像你正在试图将struct的地址转换为 char*,并且使用ostream::write就可以了。这根本行不通。 有填充,但也有不同类型的大小(其中 因平台不同而不同),字节顺序,以及更多异构平台(包括大多数大型机)的数据表示本身。 一般来说,您需要规定输出数据应该看起来像什么,如字节一样,然后您必须用 所需的值写入每个字节。

而这只是简单的类型。对BRUSHOBJ的快速浏览显示 它包含一个指针,你可能需要 关注—你肯定要做点什么,因为 接收端将无法对指针做任何事情进入您的 数据。 (我怀疑,鉴于描述,你将不得不将它转换成某种标识符,并发送一个这样的标识符到对象的字典映射。但我不知道如何使用这个结构 当然。)