Delphi中使用API ReadFile 的一个问题

璀璨夜空 2010-01-04 03:49:44
请问Delphi对ReadFile这个API是如何定义的,为什么这样定义?
其中Buffer为什么不定义成指向缓冲区的指针?
而是定义成var Buffer这种结构?
即var Buffer为什么不定义成Buffer: PChar

我用在delphi里使用ReadFile读文件的时候,
只能使用:
buf: array[1..1024] of byte;
ReadFile(..., buf, ...);
这种结构。
而不能
buf: PChar;
GetMem(buf, 1024);
ReadFile(..., buf, ...);
问什么?

C中两者调用方法都可以的。
...全文
796 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanshikao 2011-02-12
  • 打赏
  • 举报
回复
好介绍,值得学习!
dd_zhouqian 2010-01-04
  • 打赏
  • 举报
回复
C中,数组就是指针

建议写成这样

ReadFile(..., buf^, ...); //buf -> buf^

iseekcode 2010-01-04
  • 打赏
  • 举报
回复
我觉得正如二楼所说,数组不是指针。
因为数组不是指针,所以必须以var方式传址。
这样就正好解释楼主的疑问:
既然可以把BUF声明为PCHAR,也可以声明为一个数组,那么,作为一个设计者,为什么不考虑一下兼容问题呢?
换句话说,如果仅限于PCHAR,那么数组就无法或者说至少是不方便作为参数传递。
璀璨夜空 2010-01-04
  • 打赏
  • 举报
回复
修改一下:要这样
buf: PChar;
ReallocMem(buf, 1024); //or buf := AllocMem(1024);
ReadFile(..., buf^, ...); //buf -> buf^

或者修改ReadFile声明为:
function ReadFile(hFile: Thandle; Buffer: Pointer; nNumberOfBytesToRead: DWORD;
lpNumberOfBytesRead: PDWord; lpOverlapped: POverlapped): BOOL; stdcall;external kernel32; overload;

这样就可以用
ReadFile(..., buf, ...)了。
璀璨夜空 2010-01-04
  • 打赏
  • 举报
回复
找到原因了 GetMem 改为 ReallocMem
buf: PChar;
ReallocMem(buf, 1024);
ReadFile(..., buf, ...);

问题是解决了,但是关于GetMem和ReallocMem就有点糊涂了。
slmax1 2010-01-04
  • 打赏
  • 举报
回复
等待高手
gyk120 2010-01-04
  • 打赏
  • 举报
回复
数组本来就不是指针,只不过可以相互转换而已
lhy 2010-01-04
  • 打赏
  • 举报
回复
delphi里面数组不是指针
gyk120 2010-01-04
  • 打赏
  • 举报
回复
function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;
这个问题,个人猜测是由于Delphi的流文件机制引起的,但并不确定,期待高人帮忙

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧