Delphi PByteArray到TMemoryStream和反向

Delphi PByteArray到TMemoryStream和反向,delphi,Delphi,我有以下代码。我正试图对buf指出的数据进行计算 buf:PByteArray inmem,outmem:TmemoryStream; ... size := GetFileSize(aFile, nil); buf := MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); inmem.SetSize(size); inmem.Position := 0; //buf to memorystream inmem.Write(buf[0], size); o

我有以下代码。我正试图对buf指出的数据进行计算

buf:PByteArray
inmem,outmem:TmemoryStream;
...
size := GetFileSize(aFile, nil);
buf := MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);

inmem.SetSize(size);
inmem.Position := 0;

//buf to memorystream
inmem.Write(buf[0], size);
outmem := tmemorystream.Create;
outmem.SetSize(size);

//Do memory stream processing
ProcMemoryStreams(inmem,outmem,size);
//

outmem.Position:=0;
//memorystream to buf
outmem.Read(buf[0],size); <-Access violation
buf:pbyterarray
inmem、outmem:tmememoryStream;
...
大小:=GetFileSize(aFile,nil);
buf:=MapViewOfFile(映射,文件映射,读取,0,0);
inmem.SetSize(尺寸);
内存位置:=0;
//记忆流
inmem.Write(buf[0],大小);
outmem:=tmemorystream.Create;
outmem.SetSize(尺寸);
//执行内存流处理
promemoryStream(inmem、outmem、size);
//
outmem.位置:=0;
//内存流到buf

输出内存读取(buf[0],大小) 您正试图写入只读缓冲区

buf := MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); //read-only flag HERE!
...
outmem.Read(buf[0],size);  //writing to read-only memory region

所以添加
文件\u映射\u写入
标志(不要忘记CreateFileMapping中的访问标志)

您正试图写入只读缓冲区

buf := MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); //read-only flag HERE!
...
outmem.Read(buf[0],size);  //writing to read-only memory region

所以添加
FILE\u MAP\u WRITE
flag(不要忘记CreateFileMapping中的访问标志)

1)什么是ProcMemoryStream?它是干什么的?2) 你想要实现什么?3) 错误的确切文本是什么?复制到这里。我的盲目打赌是你1)应该删除
inmem.SetSize(size)行和2)应添加
inmem:=TMemoryStream.Create()行。另一个可能的原因3)是
MapViewOfFile(map
小于
GetFileSize(aFile
)或4)
procmemoryStream
会破坏它的三个参数中的任何一个……或者任何东西,数据也太少……这是一个等待发生的内存泄漏……您的流创建了需要进行最后一次尝试的需求……除非您能保证它们将被释放……(最后一次尝试就是这样做的)这是一段代码片段,所以我没有在create或try语句中添加。谢谢1)什么是ProcMemoryStream?它是干什么的?2) 你想要实现什么?3) 错误的确切文本是什么?复制到这里。我的盲目打赌是你1)应该删除
inmem.SetSize(size)行和2)应添加
inmem:=TMemoryStream.Create()行。另一个可能的原因3)是
MapViewOfFile(map
小于
GetFileSize(aFile
)或4)
procmemoryStream
会破坏它的三个参数中的任何一个……或者任何东西,数据也太少……这是一个等待发生的内存泄漏……您的流创建了需要进行最后一次尝试的需求……除非您能保证它们将被释放……(最后一次尝试就是这样做的)这是一个代码片段,所以我没有在create或try语句中添加。谢谢如果它的格式更合适,那就更好了。请您安排一下好吗?当然是+1。有没有任何方法可以使用代码格式和一些单词强调(如普通文本中的粗体)同时?不,没有这样的事情。但是你的编辑很好。我认为这是一个更好的折衷方案。在适当的地方添加写标志后,代码运行良好。如果我不想将更改写入磁盘文件,我应该如何更改代码?在映射时使用WRITECOPY标志。修改后的PByteArray将稍后在代码中使用o outmem.read是必需的。PAGE_WRITECOPY和FILE_MAP_COPY标志会创建一个映射,其中更改不会写入文件。谢谢。如果格式更合适,这会更好。您能安排一下吗?当然是+1。是否有任何方法使用代码格式和一些单词强调(如常规文本中的粗体)同时?不,没有这样的事情。但是你的编辑很好。我认为这是一个更好的折衷方案。在适当的地方添加写标志后,代码运行良好。如果我不想将更改写入磁盘文件,我应该如何更改代码?在映射时使用WRITECOPY标志。修改后的PByteArray将稍后在代码中使用o outmem.read是必需的。页面_WRITECOPY和文件_MAP _COPY标志创建的映射不会将更改写入文件。谢谢。