fMapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, BOOL(True), PChar('search_his'));
  fWasAlreadyOpen := (fMapHandle <> 0);
  if not fWasAlreadyOpen then
     fMapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 8196,'search_his');     
  if   fMapHandle   =   0   then
     raise Exception.Create( 'CreateFileMapping  failed with error code '+IntToStr(GetLastError)); 上面已经创建了内存块,问题是我写不进去,而且写进去的是 Unicode 码
   转码部分已经做啦,用 CopyMemory API写时出错,请高手给个CopyMemory使用例子,谢谢CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);   

解决方案 »

  1.   


     PShareMem = ^TShareMem;
      TShareMem = record
        Data: array[0..255] of char;
      end;procedure TForm1.Button1Click(Sender: TObject);
    var
      str: pchar;
    begin
      str := pchar('共享内存');
      CopyMemory(@(pShare^.data), Str, Length(str));
    end;
      

  2.   


    CreateFileMapping/OpenFileMapping之后还需要执行MapViewOfFile将镜像关联到内存才能操作
      

  3.   


    type
      PShareMem = ^TShareMem;
      TShareMem = record
        Data: array[0..255] of char;
      end;
    var
      PShare: PShareMem;
      HMapping: THandle;
    procedure OpenMap;
    begin
       {创建一个文件映射内核对象}
      HMapping := CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShareMem),            pchar('Map Name'));
      if (hMapping = 0) then
      begin
        Application.Terminate;
        exit;
      end;
       {将文件数据映射到进程的地址空间}
      PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0));
      if PShare = nil then
      begin
        CloseHandle(HMapping);
        Application.Terminate;
        exit;
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str: pchar;
    begin
      str := pchar('共享内存');
      CopyMemory(@(pShare^.data), Str, Length(str));
    end;
      

  4.   


    Type
      TData = record
        Str: array[0..255] of Char;
      end;
    procedure CreateShareFile;
    begin
      FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TData), 'MapMEM');
      if FHandle <> 0 then
      begin
        FDLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
        if FDLLData <> nil then StrLCopy(FDllData.Str, PChar(ExtractFilePath(Paramstr(0))), 255);
      end;
    end;
    调用:
    function GetStr: string;
    var
      FHandle: LongWORD;
      DLLData: PData;
      _Str: string;
    begin
      FHandle := OpenFileMapping(PAGE_READWRITE, False, 'MapMEM');
      if FHandle <> 0 then
      try
        DLLData := MapViewOfFile(FHandle, FILE_MAP_READ, 0, 0, 0);
        if DLlData <> nil then
        try
          Result := DllData.Str;
        finally
          UnmapViewOfFile(DLLData);
        end;
      finally
        CloseHandle(FHandle);
      end;
    end;