Q&A

  • 다시 한번 봐 주세요.. 배열이 잡히질 않아요. T.T
현재 소스는 a.exe 와 b.exe를 병합하여 c.exe에 저장하는 소스입니다.

아래에 보면 b.exe 파일크기가 동적으로 변하여 outbuffer를 동적 배열로

잡았습니다. 그런데 inbuffer처럼 크기가 명확히 정의 되어 있는 a.exe는

c.exe에 옮겨 지는데 동적으로 생성시킨 outbuffer를 이용한 b.exe --> c.exe로의

copy는 안되고 있습니다.

동적 생성 함수인 setlength,getmem 해봤지만 같은 결과 이구요!

Api 함수인 globalalloc 은 정확한 사용을 몰라 못쓰고 있습니다.



아래 코드에서 뭐가 잘못되었는지 . 그 해결책은 무엇인지 제발 please help me ~T.T~ 가려쳐 주세요.... 벌써 1주일째입니다.



procedure Merge;

var

Target, TargetG, GV : TFilestream;

InBuffer: array[0..338431] of Byte;

OutBuffer: array of byte;

begin

setlength(outbuffer,1000);

Target := TFilestream.create('A.exe', fmOpenRead or fmShareExclusive);

Target.ReadBuffer(InBuffer,sizeof(InBuffer));



TargetG := TFilestream.create('B.EXE', fmOpenRead or fmShareExclusive);

TargetG.ReadBuffer(OutBuffer,sizeof(OutBuffer));



GV := TFilestream.create('C.exe', fmCreate);

GV.WriteBuffer(OutBuffer,sizeof(OutBuffer));

GV.WriteBuffer(InBuffer,sizeof(InBuffer));



Target.Free;

GV.Free;

TargetG.Free;

END;







1  COMMENTS
  • Profile
    김진호 2001.04.27 04:40
    궁금이 wrote:

    > 현재 소스는 a.exe 와 b.exe를 병합하여 c.exe에 저장하는 소스입니다.

    > 아래에 보면 b.exe 파일크기가 동적으로 변하여 outbuffer를 동적 배열로

    > 잡았습니다. 그런데 inbuffer처럼 크기가 명확히 정의 되어 있는 a.exe는

    > c.exe에 옮겨 지는데 동적으로 생성시킨 outbuffer를 이용한 b.exe --> c.exe로의

    > copy는 안되고 있습니다.

    > 동적 생성 함수인 setlength,getmem 해봤지만 같은 결과 이구요!

    > Api 함수인 globalalloc 은 정확한 사용을 몰라 못쓰고 있습니다.

    >

    > 아래 코드에서 뭐가 잘못되었는지 . 그 해결책은 무엇인지 제발 please help me ~T.T~ 가려쳐 주세요.... 벌써 1주일째입니다.

    >

    > procedure Merge;

    > var

    > Target, TargetG, GV : TFilestream;

    > InBuffer: array[0..338431] of Byte;

    > OutBuffer: array of byte;

    > begin

    > setlength(outbuffer,1000);

    > Target := TFilestream.create('A.exe', fmOpenRead or fmShareExclusive);

    > Target.ReadBuffer(InBuffer,sizeof(InBuffer));

    >

    > TargetG := TFilestream.create('B.EXE', fmOpenRead or fmShareExclusive);

    > TargetG.ReadBuffer(OutBuffer,sizeof(OutBuffer));

    >

    > GV := TFilestream.create('C.exe', fmCreate);

    > GV.WriteBuffer(OutBuffer,sizeof(OutBuffer));

    > GV.WriteBuffer(InBuffer,sizeof(InBuffer));

    >

    > Target.Free;

    > GV.Free;

    > TargetG.Free;

    > END;



    OutBuffer: array of byte; 는 2바이트 포인터일 뿐 절때..

    TargetG.ReadBuffer(OutBuffer,sizeof(OutBuffer));==> 방법은 올지 않다구 생각

    합니다.



    Sizeof 대신 1000을 쓰시면 해경 되리라 봅니다.



    GetMem을 이용 하신다면...

    //화일의 크기를 알아 온다.

    function GetFileSize(Path : String) : integer;

    var SearchRec: TSearchRec;

    Re: integer;

    Int : integer;

    begin

    Re := Sysutils.FindFirst(Path, faAnyFile, SearchRec);

    if Re = 0 then int := SearchRec.Size;

    FindClose(SearchRec);

    Result := int;

    end;



    procedure Merge;

    var

    Target, TargetG, GV : TFilestream;

    InBuffer: array[0..338431] of Byte;

    OutBuffer: PByte;

    AA : integer;

    begin

    aa := GetFileSize('AA.EXE')

    GetMem(OutBuffer, AA);

    //임의의 크기.. 실행 화일의 크기를 알아보는 함수를 쓰세염..

    Target := TFilestream.create('A.exe', fmOpenRead or fmShareExclusive);

    Target.ReadBuffer(InBuffer,sizeof(InBuffer));



    TargetG := TFilestream.create('B.EXE', fmOpenRead or fmShareExclusive);

    TargetG.ReadBuffer(OutBuffer^,AA);



    GV := TFilestream.create('C.exe', fmCreate);

    GV.WriteBuffer(OutBuffer^, AA);

    GV.WriteBuffer(InBuffer,sizeof(InBuffer));



    Target.Free;

    GV.Free;

    TargetG.Free;

    FreeMem(OutBuffer, AA);

    END;

    입니다..