如何将一个DCU文件的里面几个字节更改?
即是我知道的十六进制代码为:AA 78 DD BB CC
我想将它改为:AA 65 DD 12 CC.
请给代码!

解决方案 »

  1.   

    一定要用delpi写代码吗?
    好像很多软件都可以做到这点啊!
      

  2.   

    这还不简单,用TFileStream打开,用Seek定位到那个修改的字节,读出,修改,再写入。就完了。代码就不知怎么写了。
      

  3.   

    帮你写吧:
    procedure EditFile(FileName: string; DestBuffer, 
      EditBuffer: Pointer; Count: Integer);
    var
      Step, RetVal, FileSize: Integer;
      Buffer: Pointer;
      Stream: TFileStream;
    begin
      Stream := TFileStream.Create(FileName, fmOpenReadWrite);
      try
        GetMem(Buffer, Count);
        try 
          Step := 0;   
          Stream.Position := Step;
          FileSize := Stream.Size - Count;
          while Step <= FileSize do
          begin
            Stream.ReadBuffer(Buffer^, Count);
            if CompareMem(Pointer(Buffer), DestBuffer, Count) = 0 then
            begin
              Stream.Position := Step;
              Stream.WriteBuffer(EditBuffer^, Count);
              break;
            end;
            Inc(Step);
            Stream.Position := Step;        
          end;
        finally
          Free;
        end;
      finally
        Stream.Free;
      end;
    end;procedure ButtonClick;
    var
      Dest, Edit: array [0..5] of Byte;
    begin
      Dest[0] := $DA;
      Dest[1] := $AB;
      ...
      Edit[0] := $dd;
      Edit[1] := $AA;
      EditFile('c:\a.dcu', Dest, Edit);
    end;大概是这样吧,没调试。
      

  4.   

    那个:
      try  finally
        FreeMem(Buffer);
        //不是Free
      end;
      

  5.   

    我随手打的,所以随处也能看到问题。
      while Step <= FileSize do

      while Step > FileSize do不看了,再看又看到错的我也又要回,自已改吧
      

  6.   

    这个Count的值应该是多少呢?
      

  7.   

    就是: sizeof(dest),就是array [0..5] of Char = 6 啊,
    你自已定义的嘛while Step <= FileSize do那while没有错,我现在头晕了,不清楚了
      

  8.   

    还有CompareMem返回的是Boolean, 不是Integer,再改.睡觉啦.:)
      

  9.   

    我改了,但一运行就出错!不知错在哪里呢?function TForm1.EditFile(FileName: string; DestBuffer,
      EditBuffer: Pointer; Count: Integer):Boolean;
    var
      Step, RetVal, FileSize: Integer;
      Buffer: Pointer;
      Stream: TFileStream;
    begin
      Stream := TFileStream.Create(FileName, fmOpenReadWrite);
      result := False;
      try
        GetMem(Buffer, Count);
        try
          Step := 0;
          Stream.Position := Step;
          FileSize := Stream.Size - Count;
          while Step <= FileSize do
          begin
            Stream.ReadBuffer(Buffer^, Count);
            if CompareMem(Pointer(Buffer), DestBuffer, Count) then
            begin
              Stream.Position := Step;
              Stream.WriteBuffer(EditBuffer^, Count);
              break;
              Result := True;
            end;
            Inc(Step);
            Stream.Position := Step;
            Result := False;
          end;
        finally
           FreeMem(Buffer);
        end;
      finally
        Stream.Free;  end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Dest, Edit: array [0..3] of Char;
      Path :String;
    begin
     Path := ExtractFilePath(Application.ExeName);
      Dest[0] := #$75;
      Dest[1] := #$18;
      Dest[2] := #$6A;
      Dest[3] := #$EF;
     // ...
      Edit[0] := #$EB;
      Edit[1] := #$18;
      Edit[2] := #$6A;
      Edit[3] := #$EF;
     if  EditFile(Path+'a.dcu', Pointer(Dest), Pointer(Edit),Sizeof(Dest)) then
     ShowMessage('Good');end;
      

  10.   

    基本思路:
    procedure EditFile(FileName: string; DestBuffer, 
      EditBuffer: Pointer; Count: Integer);
    var
      Step, RetVal, FileSize: Integer;
      Buffer: Pointer;
      Stream: TFileStream;
    begin
      Stream := TFileStream.Create(FileName, fmOpenReadWrite);
      try
        GetMem(Buffer, Count);
        try 
          Step := 0;   
          Stream.Position := Step;
          FileSize := Stream.Size - Count;
          while Step <= FileSize do
          begin
            Stream.ReadBuffer(Buffer^, Count);
            if CompareMem(Pointer(Buffer), DestBuffer, Count) = 0 then
            begin
              Stream.Position := Step;
              Stream.WriteBuffer(EditBuffer^, Count);
              break;
            end;
            Inc(Step);
            Stream.Position := Step;        
          end;
        finally
          Free;
        end;
      finally
        Stream.Free;
      end;
    end;procedure ButtonClick;
    var
      Dest, Edit: array [0..5] of Byte;
    begin
      Dest[0] := $DA;
      Dest[1] := $AB;
      ...
      Edit[0] := $dd;
      Edit[1] := $AA;
      EditFile('c:\a.dcu', Dest, Edit);
    end;
      

  11.   

    不会吧,还出错,我调试过了,你用UltraEdit打开DCU文件,随便找个字节来修改,最好明显点,如修改成上下行一样,容易比较。function EditFile(FileName: string; DestBuffer,
      EditBuffer: Pointer; Count: Integer): Boolean;
    var
      Step, FileSize: Integer;
      Buffer: Pointer;
      Stream: TFileStream;
    begin
      Result := False;
      Stream := TFileStream.Create(FileName, fmOpenReadWrite);
      try
        GetMem(Buffer, Count);
        try
          Step := 0;
          Stream.Position := Step;
          FileSize := Stream.Size - Count;
          while Step <= FileSize do
          begin
            Stream.ReadBuffer(Buffer^, Count);
            if CompareMem(Pointer(Buffer), DestBuffer, Count) then
            begin
              Stream.Position := Step;
              Stream.WriteBuffer(EditBuffer^, Count);
              Result := True;
              break;
            end;
            Inc(Step);
            Stream.Position := Step;
          end;
        finally
          FreeMem(Buffer);
        end;
      finally
        Stream.Free;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Dest, Edit: array[0..3] of Byte;
    begin
      Dest[0] := $3C;
      Dest[1] := $70;
      Dest[2] := $0B;
      Dest[3] := $53;
      // ...
      Edit[0] := $32;
      Edit[1] := $2D;
      Edit[2] := $00;
      Edit[3] := $72;
      if EditFile('c:\temp\a.dcu', @Dest[0], @Edit[0], Sizeof(Dest)) then
        ShowMessage('Good')
      else
        ShowMessage(':(((');
    end;这是文件流方式,如果文件不大,可以用TMemoryStream,比较速度会快点,用它的Memory指针,也不用ReadBuffer,直接CompareMem(Pointer(Integer(Memory) + Step), DestBuffer, Count),做循环就得了,代码嘛就自已写了。