TSharedMemory = packed record
     Int1:       Integer;
     Str1:       String[255];
     Str2:       array [0..255] of Char;
     Str3:       WideString;
     Obj:        TMyObject;   
  end;
  PSharedMemory = ^TSharedMemory;
  
  使用中发现,对Str3也就是 WideString操作时会出错,对Obj也是,
难道共享内存只能用最原子的数据类型而且数据长度是固定的?如何把任意对象放到共享内存中共享?

解决方案 »

  1.   

    不太了解 delphi 中的共享内存,关注
      

  2.   

    你的record不是内存共享的,对Str3赋值如果长度太长,应该使用SetLength设置长度,对Obj只能赋值对象指针
      

  3.   

    下面才是共享内存形式的记录,其中WideString不能确定初始长度,所以改为array[0..127] of WideChar:
      TSharedMemory = packed record
        case Integer of
         0: (Int1:       Integer);
         1: (Str1:       String[255]);
         2: (Str2:       array [0..255] of Char);
         3: (Str3:       array[0..127] of WideChar);
         4: (Obj:        TObject);
      end;
      

  4.   

    maozefa(阿发伯):我是用存映射文件技术CreateFileMapping,MapViewOfFile 函数创建共享内存的CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
                     SizeOf(TSharedMemory), LPCTSTR(Alias));
    这样写有问题吗
      

  5.   

    谢谢maozefa(阿发伯):你写的    
         case Integer of
         0: (Int1:       Integer);
         1: (Str1:       String[255]);
         2: (Str2:       array [0..255] of Char);
         3: (Str3:       array[0..127] of WideChar);
         4: (Obj:        TObject);
    让我有点摸不着头脑,能解释一下吗
      

  6.   

    不明白你的意思,CreateFileMapping不过是把一个磁盘文件映射到内存,这和共享内存记录是2回事,定义一个记录变量就可使用记录字段了。
      

  7.   

    让我有点摸不着头脑,能解释一下吗
    ==================================================
    这个纪录的所有成员共享同一段内存,比方说,你对Str1:='abc';那么Str2也是'abc'.
    我可能误解你的意思了,因为你的记录是不适合这种形式的。
      

  8.   

    同意楼上 
     case Interger of 
    变体记录 ...
      

  9.   

    不错,共享内存只能用基本数据类型,或由其组成的结构。任意对象(包括String等)都是不行的,因为它只是个指针。
    在对象被创建时,对象本身所占用的内存在堆中自动分配,你无法“指定”分配到共享内存上。
      

  10.   

    楼主问的恐怕是下面帖中说的东东,没用过,偶尔看到,帮你索引。http://community.csdn.net/Expert/topic/5267/5267095.xml?temp=.8659479
      

  11.   

    我明白,共享的意思是,不同进程间数据传送。
    TSharedMemory = packed record
    Int1: Integer;
    Str1: String[255];
    Str2: array [0..255] of Char;
    Str3: array [0..255] of WideChar;
    //Obj: TMyObject;// TObject不可能直接共享了,你还是把他的属性或成员复制到本record中来吧
    end;
    PSharedMemory = ^TSharedMemory;
      

  12.   

    WideString类型不能做为共享内存的数据类型,必须指定它的长度,这样才能控制。