메모리 스트림 두개가 필요함.
 
 
procedure GetTextFromBinaryFile(FileName: String; sList: TStringList);
var
  mStream, mStream2: TMemoryStream;
begin
  mStream:=TMemoryStream.Create;
  mStream2:=TMemoryStream.Create;
  try
    mStream.LoadFromFile(FileName);
    mStream.Position:=0;
    mStream.ReadResHeader;
    ObjectBinaryToText(mStream, mStream2);
    mStream2.Position:=0;
    sList.LoadFromStream(mStream2);
  finally
    FreeAndNil(mStream);
    FreeAndNil(mStream2);
  end;
end;
 
 
 
 
 
 
*** dfm 파일은 텍스트도 있고 바이너리도 있다.
어느 것이든 상관없이 Component의 Name과 ClassName 을 추출하는 함수를 만들어 봤다 ***
 
 
매개변수 중 ComponentsList 에 Memo1.Lines 같은 걸 넣어서 바로 눈으로 확인해보자.
 
 
procedure GetComponents(FileName: String; ComponentsList: TStrings);
var
  mStream, mStream2: TMemoryStream;
  sList: TStringList;
  i: Integer;
 
begin
  mStream:=TMemoryStream.Create;
  mStream2:=TMemoryStream.Create;
  sList:=TStringList.Create;
  try
    mStream.LoadFromFile(FileName);
    mStream.Position:=0;
 
    // 바이너리
    if (Byte(mStream.Memory^)=$FF) then begin
      mStream.ReadResHeader;
      ObjectBinaryToText(mStream, mStream2);
      mStream2.Position:=0;
      sList.LoadFromStream(mStream2);
    end
    // 텍스트
    else sList.LoadFromFile(FileName);
 
    for i:=0 to sList.Count-1 do begin
      if
Pos('object ', sList[i])>0 then begin
        sList[i]:=StringReplace(sList[i], 'object ', '', [rfReplaceAll]);
        ComponentsList.Add(sList[i]);
      end;
    end;
  finally
    FreeAndNil(sList);
    FreeAndNil(mStream);
    FreeAndNil(mStream2);
  end;
end;






Posted by bloodguy
,