Delphi表单(DFM)转为文本

4

我该如何使用C#将Delphi的DFM表单从二进制格式转换为文本格式?

3个回答

17

最好的方法可能是调用CONVERT.EXE,这是Delphi附带的命令行应用程序。以下是Delphi中的示例。您也可以在C#中执行相同的操作。


1
提示:将*.DFM文件类型与CONVERT.EXE关联起来。这样,您就可以在资源管理器中选择多个DFM文件,并在上下文菜单中选择“使用Convert打开”。 - Jørn E. Angeltveit

3

我使用以下四种方法来测试DFM文件格式并进行转换:

function IsDFMStreamBinary( AStream: TMemoryStream ): Boolean;
{ Returns true if dfm file is in a binary format }
var
  F: TMemoryStream;
  B: byte;
begin
  B := 0;
  F := TMemoryStream.Create;
  F.LoadFromStream( AStream );
  try
    F.read( B, 1 );
    Result := B = $FF;
  finally
    F.Free;
  end;
end;

function DfmFile2Stream( const ASrc: string; ADest: TStream ): Boolean;
{ Save dfm to stream }
var
  SrcS: TFileStream;
begin
  SrcS := TFileStream.Create( ASrc, fmOpenRead or fmShareDenyWrite );
  try
    ObjectResourceToText( SrcS, ADest );
    Result := True;
  finally
    SrcS.Free;
  end;
end;

procedure Txt2DFM( ASrc, ADest: string );
{ Convert Text to DFM }
var
  SrcS, DestS: TFileStream;
begin
  SrcS := TFileStream.Create( ASrc, fmOpenRead );
  DestS := TFileStream.Create( ADest, fmCreate );
  try
    ObjectTextToResource( SrcS, DestS );
  finally
    SrcS.Free;
    DestS.Free;
  end;
end;

function Dfm2Txt( const ASrc, ADest: string ): boolean;
{ Convert a binary DFM to text }
var
  ASrcS, ADestS: TFileStream;
begin
  ASrcS := TFileStream.Create( ASrc, fmOpenRead );
  ADestS := TFileStream.Create( ADest, fmCreate );
  try
    ObjectResourceToText( ASrcS, ADestS );
    Result := True;
  finally
    ASrcS.Free;
    ADestS.Free;
  end;
end;

如果你没有忽略问题中的“来自C#”部分,我会投赞成票的。 - Ken White
不清楚为什么你展示了四个函数而不是三个或五个(或九个?)。我的意思是,DfmFile2Stream的相关性可能和DfmStream2File一样高。 - Wolf

0

Delphi的二进制DFM文件实际上是一个对象的二进制表示。

完成此工作的正确方法是编写自私的C#命令行实用程序(不再需要任何外部依赖项),基于对二进制DFM文件本身格式的了解。

如果格式未公开,进行逆向工程应该是可行的:

  • ObjectResourceToText源代码可用(Classes.pas)。
  • 可用于生成所需输入的转换器(从二进制到文本和反之亦然)。

问题在你的评论一年前已经得到了充分的回答,它还能添加什么? - RichardTheKiwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接