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中两者调用方法都可以的。
...全文
753 9 打赏 收藏 转发到动态 举报
写回复
用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的流文件机制引起的,但并不确定,期待高人帮忙
Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
delphi的字幕滚动窗体程序 代码如下 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls; type TForm1 = class(TForm) Timer1: TTimer; Edit1: TEdit; Button3: TButton; Button2: TButton; TrackBar1: TTrackBar; Panel1: TPanel; Label1: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure zShowText; Procedure zBmpCreate; procedure zSetBmp; procedure zSetLineHeight; procedure zShowLine(sender :TObject); { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} var currline, LineHeight:integer; sItem:TStringList; bmp:TBitMap; bRect,R1:TRect; iDc:HDC; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Enabled:=False; iDC:=GetDc(Panel1.handle); Currline:=0; end; procedure TForm1.zShowLine(sender :TObject); begin zShowText; end; procedure TForm1.Timer1Timer(Sender: TObject); begin zShowLine(self);//显示字符串 //bitblt 转移矩形图 (目标句柄,LS x,y,宽,高,源句柄,LS x,y,光栅运算符) BitBlt(iDc,0,0,Panel1.Width,Panel1.Height, Bmp.Canvas.Handle,0,Currline,srcCopy); //改变currline可实现左移右移 Inc(Currline,1); if Currline>=bRect.Bottom-panel1.Height+100 then begin Timer1.Enabled:=False; Currline:=0; end; end; procedure TForm1.zShowText; var ss:string; ReadFile:TextFile; begin AssignFile(ReadFile,Edit1.Text); Reset(ReadFile); sItem:=TStringList.Create; with sItem do while not eof(ReadFile) do begin Readln(ReadFile,ss); add(ss); end; CloseFile(ReadFile); zBmpCreate; sItem.Free;//释放串 end; procedure TForm1.zBmpCreate; //创建图片 var i,y:integer; //y begin if bmp<>nil then bmp.free; bmp:=TBitMap.Create; zSetBmp; R1.Right:=bRect.Right; R1.Bottom:=bRect.Bottom; y:=Panel1.Height-100; for i:=0 to sItem.Count-1 do // 从0到行数 循环显示图片 begin R1.Top:=y; R1.Bottom:=R1.Top+LineHeight; //对齐 DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_Center or Dt_Top); //左对齐 //DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_Left or Dt_Top); //右对齐 //DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_Right or Dt_Top); Inc(y,LineHeight); end; end; procedure TForm1.zSetBmp; begin zSetLineHeight; with bRect do //Rect 矩形坐标(左上x,左下y,右上x,右下y) begin Top:=0; Left:=0; Right:=Panel1.Width; Bottom:=LineHeight*sItem.Count+Height;//行高*行数+form高度 end; with Bmp do begin Height:=bRect.Bottom+100;//图片高度 Width:=bRect.Right; with Canvas do //canvas 画布 begin FillRect(bRect); Brush.Style:=bsClear; end; end; end; procedure TForm1.zSetLineHeight; {设置行间隔} var Metrics:TTextMetric; //设置字体 API begin GetTextMetrics(iDc,Metrics); LineHeight:=Metrics.tmHeight+Metrics.tmInternalLeading-Bmp.Canvas.Font.Height; end; procedure TForm1.Button2Click(Sender: TObject); begin if Edit1.Text='' then ShowMessage('请输入文件地址') else Timer1.Enabled:=not Timer1.Enabled; end; procedure TForm1.Button3Click(Sender: TObject); begin timer1.Enabled :=false; Currline:=0; Button2.Click; end; procedure TForm1.TrackBar1Change(Sender: TObject); begin Timer1.Interval:=TrackBar1.Position*5; end; procedure TForm1.FormDestroy(Sender: TObject); begin if Bmp<>nil then Bmp.Free; end; end.

1,183

社区成员

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

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