Delphi无法通过shellexecute执行brcc32

时间:2017-08-01 10:58:54

标签: delphi delphi-10.2-tokyo

我已经开始编写组件了,我想编写一个程序来为我生成DCR文件。组件的图片必须是24x24位图,因此我需要创建一个资源文件,然后使用brcc32创建DCR。

步骤:

  1. 创建一个24x24位图(Paint,old but gold)
  2. 创建RC文件
  3. 使用brcc32
  4. 创建DCR

    所以,我想编写一个程序来为我制作所有这些东西,这就是表格。在编辑字段中,我写了他们的Name属性。

    image

    这是代码:

    unit uBmp2rc;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.IOUtils,
      Vcl.ExtDlgs, Vcl.ExtCtrls, ShellApi;
    
    type
      TBitmapConverter = class(TForm)
        Label1: TLabel;
        edtClassName: TEdit;
        Label2: TLabel;
        edtSource: TEdit;
        Label3: TLabel;
        Label4: TLabel;
        edtDirectory: TEdit;
        OpenPicture: TOpenPictureDialog;
        Label5: TLabel;
        edtBitmap: TEdit;
        Button1: TButton;
        Button2: TButton;
        Label6: TLabel;
        Preview: TImage;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        path: string;
      public
        { Public declarations }
      end;
    
    var
      BitmapConverter: TBitmapConverter;
    
    implementation
    
    {$R *.dfm}
    
    procedure TBitmapConverter.Button1Click(Sender: TObject);
    begin
    
     if OpenPicture.Execute then
      begin
       edtBitmap.Text := OpenPicture.FileName;
       Preview.Picture.LoadFromFile(OpenPicture.FileName);
      end;
    
    end;
    
    procedure TBitmapConverter.Button2Click(Sender: TObject);
    var sw: TStreamWriter;
        tmpName, source, command: string;
    begin
    
     path := edtDirectory.Text;
     source := edtSource.Text;
    
     tmpName := TPath.Combine(path, source+'.rc');
     Preview.Picture.SaveToFile(TPath.Combine(path, source + '.bmp'));
    
     sw := TStreamWriter.Create(tmpName, False, TEncoding.UTF8);
     try
      sw.Write(edtClassName.Text + ' BITMAP "' + source + '.bmp"');
     finally
      sw.Free;
     end;
    
     command := '/C brcc32 -fo"' + TPath.Combine(path, source) + '.dcr" "' + TPath.Combine(path, source) + '.rc"';
     ShellExecute(0, nil, PChar('cmd.exe'), PChar(command), nil, SW_HIDE);
    
    end;
    
    procedure TBitmapConverter.FormCreate(Sender: TObject);
    begin
     edtDirectory.Text := TPath.GetDocumentsPath;
    end;
    

    我可以正确创建RC文件,但是没有创建DCR。我在命令中做错了吗?

    我在谷歌搜索后添加了PChar(),我在StackOverflow上找到了提示,但我仍然不确定。

1 个答案:

答案 0 :(得分:5)

当我为我的组件创建图像时,我使用记事本,并使用默认编码将文件保存为filename.rc ANSI ,而不是UTF8)。您正在使用UTF8,您应该更改:

sw := TStreamWriter.Create(tmpName, False, TEncoding.UTF8);

用这个:

sw := TStreamWriter.Create(tmpName, False, TEncoding.ANSI);

如果您使用ANSI编码,您的程序将起作用。你的命令是正确的;如果您尝试运行cmd.exe并使用这些参数调用brcc32,您会发现UTF8编码会给您一个错误。相反,ANSI编码完美地运行,您可以准备好*.drc文件。

请参阅here类似的内容,它是关于c ++ builder的,但它表明问题与UTF8编码有关。