请大家帮忙看看var ms:TMemoryStream;
Buffer:array of Byte;操作:
Ms := TMemoryStream.Create;
Ms.LoadFromFile('d:\1.exe');
setlength(buffer,sizeof(ms));
ms.read(Buffer,Sizeof(ms));read以后已分配空间的buffer反而没有空间了
不知道错在哪里
Buffer:array of Byte;操作:
Ms := TMemoryStream.Create;
Ms.LoadFromFile('d:\1.exe');
setlength(buffer,sizeof(ms));
ms.read(Buffer,Sizeof(ms));read以后已分配空间的buffer反而没有空间了
不知道错在哪里
解决方案 »
- 如何用delphi做一个程序,可以打开某个网页
- 有关form滚动条的问题
- 在引用DataModule内控件出错
- Indy10比Indy9提高了哪些地方?有必要升级吗?
- 各位高手,求你们看看,我急啊!!!在线等!!!!(祝各位新年快乐!!!万事如意)
- 请高手们进来帮帮忙!!(不要碰到问题就躲着俺!)
- 急啊急!贴子挂了一星期没人回答,不能提前了,请高手进来看看。
- 使用installshield制作安装程序后碰到的怪事
- 用enumchildwindows找句柄的問題??
- 我想把一个已经编译好的程序,从新编译成DLL,哪位大侠能告诉我该如何去做,将不胜感激。
- vb.net 的toolbar 问题:给整个toolbar加上背景图片,不仅仅是toolbar的按钮
- 如何屏蔽错误提示(急)
Ms.LoadFromFile('d:\1.exe');
Ms.Position := 0;
setlength(buffer, ms.size);
ms.read(Buffer,ms.size);
ms.read(Buffer,ms.size);
//sizeof(ms)只得到了一个指针的大小即4
我在setlenth的时候正常,先取得ms.size再设置长度的(上面的代码是我临时写,不是照抄的)
只是读内容到缓冲的时候清空了缓冲的内存分配,不知为什么会这样不过上面的问题确实没有意识到
Buf: array of Byte;
BufDest: array of Byte; Fs := TFileStream.Create('d:\tt.lib', fmCreate);
Ms := TMemoryStream.Create;
Ms.LoadFromFile('D:\tt.tmp');
SourceLen := Ms.Size;
Fs.Write(SourceLen, SizeOf(SourceLen)); SetLength(Buf,SourceLen); //分配内存
SetLength(BufDest,SourceLen); //FillChar(Buf, Length(Buf), 0); //释放了Buf的内存 Ms.Read(Buf, Length(Buf)); //结果也会导致buf内存被释放
//FillChar(BufDest, Length(BufDest), 0);
pBufDest:= @BufDest;
DestLen:=Length(BufDest);
Err:=Compress(pBufDest,DestLen,Buf,Length(Buf));
if Err=0 then
Fs.Write(BufDest, DestLen);
Fs.Free;
Ms.Free;
现在主要问题是:当MS.read的时候有问题,缓冲被释放而且DELPHI帮助里举有SozeOf例子:FillChar(Buf,SizeOf(Buf),0)
如果SizeOf不能用于指针的话,这例子就有问题了?
这是错误的写法,但编译器并不会报错.应该写成下面这样.
ms.read(pchar(Buffer)^,Sizeof(ms));
或者
ms.read(pchar(Buffer)^,length(Buffer));//显然,我更喜欢这样写.
而且DELPHI帮助都有例子:FillChar(Buf,SizeOf(Buf),0),不知为什么我这里用就不行新发现一个问题,上面的代码最后Ms.Free的时候出错,不知又是为什么
请帮忙看看这个贴子我会再加分:)
帮助上这个例子,其中BUF一定要是静态数组或者静态分配的RECORD之类的,
原因很简单,SIZEOF只是编译时处理的东西.就同C/C++的SIZEOF运算符类似.
STRING变量的首地址并不是数据首地址.
所以必须pchar(buf)^才是它实际数据位置.
这下关于sizeof是清楚了只是释放内存流的问题是什么原因?
无论是释放还是清除都出错:(
它靠引用计数维持.
SETLENGTH分配的内存,你用FREEMEM方式释放当然要出错.
ms: TMemoryStream;
Buffer: array of Byte;
begin
Ms := TMemoryStream.Create;
Ms.LoadFromFile('C:\Documents and Settings\Administrator\桌面\新建 文本文档.txt');
SetLength(buffer, ms.Size); //*1
ms.read(Buffer[0], Length(Buffer)); //*2
ShowMessage(string(buffer));
ms.Free;
end;