Delphi无法通过shellexecute执行brcc32

Delphi无法通过shellexecute执行brcc32,delphi,delphi-10.2-tokyo,Delphi,Delphi 10.2 Tokyo,我已经开始编写组件,我想编写一个程序来生成DCR文件。组件的图片必须是24x24位图,因此我需要创建一个资源文件,然后使用brcc32创建DCR 步骤: 创建24x24位图(绘制,旧但为金色) 创建RC文件 使用brcc32创建DCR 所以,我想写一个程序,为我制作所有这些东西,这是表格。在编辑字段中,我编写了它们的Name属性 代码如下: unit uBmp2rc; interface uses Winapi.Windows, Winapi.Messages, System.SysU

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

步骤:

  • 创建24x24位图(绘制,旧但为金色)
  • 创建RC文件
  • 使用brcc32创建DCR
  • 所以,我想写一个程序,为我制作所有这些东西,这是表格。在编辑字段中,我编写了它们的
    Name
    属性

    代码如下:

    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的提示,但我仍然不确定。

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

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

    sw := TStreamWriter.Create(tmpName, False, TEncoding.ANSI);
    
    如果您使用ANSI编码,您的程序将正常工作。你的命令是正确的;如果您尝试运行
    cmd.exe
    并使用这些参数调用brcc32,您将看到UTF8编码给您一个错误。相反,ANSI编码工作得很好,您可以使用您的
    *.drc
    文件


    参见类似的内容,它是关于C++ Builder的,但是它表明问题与UTF8编码有关。< /P>为什么不检查返回错误?您可能需要指定

    brcc32.exe
    的整个路径。我还认为整个开场白与问题无关。嗯,我怀疑问题在你的rc文件中。我会复制你的代码,我会检查,我认为UTF8不是你想要的。谷歌上也有一些东西it@RaffaeleRossi,这很公平,但你为什么不检查错误呢?错误(即使来自Windows shell本身中的cmd.exe,也可能提供线索)拉斐尔找到了答案,正如@kobik所说,您可以检查错误。为了找到它,我只保存了一个UTF8RC,并用brcc32对其进行了测试。它给了我一个错误“源输入中的坏字符”,我在谷歌上搜索了它,发现了解决方案(=UTF8坏,ANSI好)。要求shell创建cmd进程来创建brcc32进程是毫无意义的。调用CreateProcess来创建一个brcc32进程。但是ANSI和UTF8之间有什么区别呢?他们是如何存储字符的?@RaffaeleRossi-google可以完全回答您的问题。不管怎样,换成ANSI解决了我的问题,谢谢