Создание .exe с иконкой

Файл который создаёт ресурс:

{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}

uses System.Resources;

begin
  var icon := new System.Drawing.Icon('Icon.ico');
  var str := new System.IO.MemoryStream;
  icon.Save(str);
  
  System.IO.File.Delete('test.resources');
  var wr := new ResXResourceWriter('test.resources');
  wr.AddResource('', str.ToArray);
  wr.Generate;
  wr.Close;
end.

Файл к которому надо прикрепить иконку:

{ $resource 'test.resources'}//Компилируется, но не работает как иконка
{$mainresource 'test.resources'}//Ошибка: файл не содержит ресурсов
{ $mainresource 'icon.ico'}//Ошибка: файл не содержит ресурсов

begin
  
end.

Test.rar (30,8 КБ)

Я как то не так делаю файл ресурсов? Или это ошибка $mainresource?

1 лайк

Собственно, @Admin, @ibond, каким должен быть файл чтоб $mainresource его принимал? Я что то его вообще ни с чем не могу заставить работать.

.res

Ооо как… А как его создать? Если я просто меняю расширение на .res в первой программе - всё остаётся так же, ошибка та же самая.

Кроме всего, я не понимаю откуда берётся эта ошибка. Я посмотрел в исправлении #1295, увидел какое исключение вы ловите, и вот непонятно что её вызывает.

  • Я нашёл это, то есть то - как добавляется неуправляемый ресурс. Но не вижу нигде ограничений.

  • Так же нашёл метод Save, при выполнении которого вы ловите System.Runtime.InteropServices.COMException. Это, скорее всего исключение которое вызывается при неправильном ресурсе. Но на msdn не написано чтоб Save могло вызвать это исключение.

То есть, в итоге - проблема не в расширении, а в содержании файла. Можете хотя бы дать ссыль, где будет объяснять, чего именно не хватает?

Вам надо компилировать ресурс с помощью утилиты rc.exe

1 лайк

Test.rar (197,8 КБ)

Я запускаю так:

  var p := new System.Diagnostics.Process;
  p.StartInfo.FileName := 'rc.exe';
  p.StartInfo.Arguments := '/fm test.resx /fo test.resources';
  p.Start;

Это единственные 2 команды которые принимают текст, то есть то - что может содержать имена файлов. При этом на msdn сказано что их всегда надо использовать вместе, вот вместе и поставил.

Консолька быстро появляется, что то выписывает и сразу закрывается, перед тем как можно что то прочитать. При этом в папке ничего не меняется.

P.S. получилось сделать скриншот перед тем как оно исчезнет:

При чём, если запустить с аргументом “/?” - то окно тоже не даёт прочитать помощь, сразу закрывается.

Ловить скриншот консоли, запущенной как субпроцесс из-под Паскаля?! Да уж, мсье знает толк в извращениях! :crazy_face: Что мешает вам поиграться с этой утилиткой в отдельной виндозной консоли и сперва разобраться там с параметрами её вызова?

Clipboard01

2 лайка

Да уж. У меня такое с csc.exe долгое время было. Запускайте программу через bat - ник и будет Вам счастье. Можете написать код, перехватывающий сообщения консоли и направляющий его в textbox/файл/свою консоль.

То, что она всё равно закрывается сразу, не ожидая пользовательского ввода.

Да, это ещё легче сделать через паскаль, и я уже сделал, но там выводится то же самое что на msdn, только чуть меньше инфы. А на msdn я прочитал что было, и вот говорою:

Скорее всего, проблема в синтаксисе, но я не нашёл ни 1 примера работы с этой программой, на msdn только список команд, как и по команде /?

Test.rar (230,9 КБ)

Разобрался, rc.exe не принимает xml файлы, принципиально. Ему нужен текстовый файл со списком файлов которые надо добавить. А ResXResourceWriter создавал xml файлы. В общем сработало, кому понадобится - скачивайте и смотрите архив выше.

1 лайк

Спасибо, давно хотел это узнать.