把一个EXE文件读出来用文本框显示,Buf一直是空的。
procedure TfrmPEView.LoadFileToText;
var
  i,nFileHnd,nFileLen,nReadByte: Integer;
  Buf: PChar;
begin
  try
    nFileHnd := FileOpen('F:\abc.exe', fmOpenRead{ or fmShareDenyNone});
    nFileLen := FileSeek(nFileHnd,0,soFromEnd);
    FileSeek(nFileHnd,0,soFromBeginning);    Buf := PChar(AllocMem(nFileLen + 1));
    nReadByte := FileRead(nFileHnd, Buf, nFileLen);
    FileClose(nFileHnd);    for i := 0 to nReadByte - 1 do
      begin
        if Buf[i] = #0 then
          Buf[i] := #20;
      end;    FileText.Text := String(Buf);
  finally
    FreeMem(Buf);
  end;
end;

解决方案 »

  1.   

    nReadByte := FileRead(nFileHnd, Buf, nFileLen);
    改成nReadByte := FileRead(nFileHnd, Buf^, nFileLen);
    试试
      

  2.   

    nReadByte := FileRead(nFileHnd, Buf, nFileLen);
    改为
    nReadByte := FileRead(nFileHnd, Buf^, nFileLen);
    多了一个^号
      

  3.   

    谢谢,文件是读出来了,可是怎么转换才能在Memo中显示出来
    如果用FileText.Text := String(Buf);或FileText.Text := AnsiString(Buf);会卡死
    刚开始用Delphi,还不能一下子从C++转过来
      

  4.   

    不是文本文件,所以才把#0换成#20啊,要不然只会显示MZ,
    就像Ultraedit一样,有字符模式,也有16进制模式
      

  5.   

    用TMemoryStream来读不是很好吗?移动流指针也很方便。如果你想将EXE读到Memo里面显示,然后用一个函数直接以EXE方式执行Momo.txt内容,这个我以前做过。不过你是富农,才给20分,怎么不大方一点?看这里:http://community.csdn.net/help/GetUsablePoint.htm
    每次发贴都可以得到30分。你发贴提问反而赚分了哦。
      

  6.   

    哦,明白了,你的问题更简单了。直接用Strpas函数来转。或者你直接用:memo1.SetTextBuf(Buf);
      

  7.   

    我刚刚所说的问题是动态加载EXE的问题,就是把外部的EXE定义到变量中,程序直接执行这个变量就等于运行了EXE。好处有两个:第一,不用释放临时文件到硬盘,就可以执行外部EXE。
                第二,如果用资源把EXE做进自己的程序中,用资源查看器可以提取出来,对EXE保密性不强。
      

  8.   

    怎么把PChar转换成Memo.Text类型啊,
    程序会停在Memo.Text := AnsiString(Buf); //String(Buf);
      

  9.   


    procedure TfrmPEView.LoadFileToText;
    var
      i: Integer;
      Buf: PChar;
      MS: TMemoryStream;
    begin
      try
        MS := TMemoryStream.Create;
        MS.LoadFromFile(FileName);
        MS.Position := 0;    Buf := AllocMem(MS.Size);
        CopyMemory(Buf,MS.Memory,MS.Size);    for i := 0 to MS.Size - 1 do
          begin
            if Buf[i] = #0 then
              Buf[i] := #20;
          end;    FileText.Lines.Clear;
        FileText.Text := StrPas(Buf);  // 程序会停在这儿
      finally
        FreeMem(Buf);
        MS.Destroy;
      end;
    end;