Delphi无法通过shellexecute执行brcc32
我已经开始编写组件,我想编写一个程序来生成DCR文件。组件的图片必须是24x24位图,因此我需要创建一个资源文件,然后使用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
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解决了我的问题,谢谢