Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
1

Как присоединить к exe файлу произвольный файл, а при запуске exe файла открыть его

04.03.2015, 12:15. Просмотров 2861. Ответов 16
Метки нет (Все метки)

Есть файл, который представляет из себя набор других файлов ) и есть exe файл, который открывает этот файл и загружает из него данные. Я хочу сделать так, чтобы не хранить эти файлы отдельно, собрать их в отдельный exe file, и чтобы основной exe файл при запуске находил в себе второй файл и загружал его. Причем сборка этих двух файлов должна создаваться моим же приложением (т.е. вариант откомпилировать проект из делфи с ресурсами не канает). Присоединяемый файл создается моей же программой. Короче говоря, исходный exe файл это проигрыватель, а файл который я хочу присоединить содержит скрипт, который я хочу проигрывать. И другая моя программа создает этот скрипт, и я хочу чтобы она умела соединять проигрыватель и скрипт в 1 exe файл, а проигрыватель умел обращаться к объединенному с собой скрипту.

Почитал про ресурсы, нашел API функции которые умеют их читать, а вот ничего что может их писать я не нашел (ну кроме как при компиляции приложения из Delphi, что мне не подходит)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2015, 12:15
Ответы с готовыми решениями:

Можно ли открыть exe файл и посмотреть его код?
у меня есть .exe файл программы, созданный в делфи, можно как-то открыть его в делфи и посмотреть...

Как открыть файл .exe?
Подскажите как открыть файл exe через делфи, если путь к этому файлу лежит в road1.txt? Получится...

Открыть файл с расширением bin, как exe
Всем привет - есть файл .bin как его открыть с расширением exe - в гугле что то не нашел ответ на...

Поиск окна по его EXE-файлу
Доброго времени суток. Вот задали задачку: "Переименовать окно чужой программы, зная только...

16
пофигист широкого профиля
4029 / 2684 / 764
Регистрация: 15.07.2013
Сообщений: 15,658
04.03.2015, 12:42 2
Цитата Сообщение от Shakielpel Посмотреть сообщение
ничего что может их писать я не нашел
Если писать должен проигрыватель в самого себя, то и не найдешь.
0
Native x86
3405 / 2242 / 660
Регистрация: 13.02.2013
Сообщений: 7,379
04.03.2015, 12:50 3
Shakielpel, любой запущенный EXE намертво блокируется на запись, поэтому функции изменения ресурсов работать не будут, равно как и функции прямой записи в файл.

Максимум, что можно сделать, -- это создать отдельный, предварительно скомпилированный и зашитый в ресурсы EXE (который будучи запущенным сделает все, что нужно с неработающим основным EXE, а потом перезапустит его и завершит свою работу), выгружать его на диск, запускать, завершаться, ждать, когда он перезапустит основной EXE, а потом удалять его. Но этот метод на современных версиях Windows потребует эскалации прав с запросом согласия пользователя через UAC.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
04.03.2015, 12:55  [ТС] 4
Если писать должен проигрыватель в самого себя, то и не найдешь.
нет, есть конструктор (отдельный exe файл), который сейчас делает файл скрипта. А я хочу, чтобы этот конструктор, прилеплял его к проигрывателю, т.е. брал файл проигрывателя, и делал его копию с прикрепленным к нему скриптом, проигрыватель не меняет при проигрывании файл скрипта.
0
2644 / 2267 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
04.03.2015, 12:59 5
Shakielpel, и при этом "проигрыватель" ни сном ни духом не должен ведать что в нем покопались ?)
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
04.03.2015, 13:02  [ТС] 6
Shakielpel, и при этом "проигрыватель" ни сном ни духом не должен ведать что в нем покопались ?)
проигрыватель тоже написан мной, поэтому я могу его переделать так, чтобы он искал скрипт в самом себе, если только пойму как это делается )

Но главное чего я пока не могу понять, это как его туда затолкать )
0
Native x86
3405 / 2242 / 660
Регистрация: 13.02.2013
Сообщений: 7,379
04.03.2015, 13:03 7
Цитата Сообщение от Shakielpel Посмотреть сообщение
я хочу, чтобы этот конструктор, прилеплял его к проигрывателю, т.е. брал файл проигрывателя, и делал его копию с прикрепленным к нему скриптом
Тогда чем вам не угодили ресурсы? Всегда можно изменить ресурсы другого EXE, если он не запущен. Можно даже не заморачиваться с ресурсами, и тупо прилепить данные в конец EXE-файла. На работоспособность это не повлияет, а прочитать эти данные он сможет и после запуска (нужно только позаботиться о том, чтобы такой EXE-файл знал длину присоединенного к нему куска).
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
04.03.2015, 13:09  [ТС] 8
Тогда чем вам не угодили ресурсы? Всегда можно изменить ресурсы другого EXE, если он не запущен. Можно даже не заморачиваться с ресурсами, и тупо прилепить данные в конец EXE-файла. На работоспособность это не повлияет, а прочитать эти данные он сможет и после запуска (нужно только позаботиться о том, чтобы такой EXE-файл знал длину присоединенного к нему куска).
С присоединением в конец файла мне непонятно как я узнаю в каком месте файла начинается скрипт и в каком он заканчивается - а без этого мне его не прочитать. Ведь на момент склеивания файлов проигрыватель уже скомпилирован, максимум что я смогу объяснить exe шнику, это каким то заднепроходным методом его же собственный размер разве что(т.е. его размер без скрипта)...

Ресурсы меня устраивают, если я узнаю как в них писать без IDE Delphi, т.е. сейчас я нашел только как компилятором делфи запихать что нибудь в ресурсы, а мне нужно чтобы мой конструктор это делал, а не делфи.
0
пофигист широкого профиля
4029 / 2684 / 764
Регистрация: 15.07.2013
Сообщений: 15,658
04.03.2015, 13:13 9
Лучший ответ Сообщение было отмечено Shakielpel как решение

Решение

UpdateResource
0
Native x86
3405 / 2242 / 660
Регистрация: 13.02.2013
Сообщений: 7,379
04.03.2015, 13:14 10
Цитата Сообщение от Shakielpel Посмотреть сообщение
мне непонятно как я узнаю в каком месте файла начинается скрипт и в каком он заканчивается - а без этого мне его не прочитать
Первое, что приходит в голову: "инсталлятор" дописывает к EXE скрипт и потом еще 4 байта с длиной этого скрипта. Целевой EXE первым делом считывает свои последние 4 байта и вуаля, он знает длину присоединенного к нему блока.
0
2644 / 2267 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
04.03.2015, 13:17 11
Цитата Сообщение от Shakielpel Посмотреть сообщение
чтобы мой конструктор это делал, а не делфи
Конструктор этот ведь твое же приложение и сделан в Делфи ?

Тогда класс TResourceStream как нельзя лучше подойдет для обращения к ресурсам "жертвы" не только для чтения, но и для создания/обновления
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
04.03.2015, 13:36  [ТС] 12
Цитата Сообщение от mss Посмотреть сообщение
Конструктор этот ведь твое же приложение и сделан в Делфи ?
Тогда класс TResourceStream как нельзя лучше подойдет для обращения к ресурсам "жертвы" не только для чтения, но и для создания/обновления
а вот тут с вами не согласны:
Но в отличие от TMemoryStream, TResourceStream поддерживает только методы чтения, но не записи, а также не поддерживает изменение размера. Иными словами, TResourceStream - это read-only.
0
2644 / 2267 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
04.03.2015, 13:42 13
наследуешься от него, перекрываешь виртуальный Write() и пишешь с пом. вызовов BeginUpdateResource, UpdateResource, EndUpdateResource

И вуаля)
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
04.03.2015, 13:53  [ТС] 14
Цитата Сообщение от northener Посмотреть сообщение
UpdateResource
через нее можно записывать только файл с расширением res? и нужно делать rc файл? или можно что угодно запихать?

хах, а может в ресурсы запихать текстовый файл в котором будет размер прикрепленного файла, если ресурса нет, то нет и прикрепленного скрипта. Ибо вдруг это просто проигрыватель без скрипта, прочитав в нем последние 4 байта и попытавшись прочитать скрипт по их значению, ужас будет.
0
Native x86
3405 / 2242 / 660
Регистрация: 13.02.2013
Сообщений: 7,379
04.03.2015, 14:00 15
Цитата Сообщение от Shakielpel Посмотреть сообщение
через нее можно записывать только файл с расширением res?
Через нее можно записывать любые данные, на которые указывает lpData, файлы вообще не нужны, это просто данные в памяти.

Цитата Сообщение от Shakielpel Посмотреть сообщение
прочитав в нем последние 4 байта и попытавшись прочитать скрипт по их значению, ужас будет
Можно сигнатуру какую-то добавить, если она не соответствует эталону, значит в хвосте ничего нет. Такой себе заголовок наоборот.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 264
04.03.2015, 14:21  [ТС] 16
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// запихнуть в исполняемый файл в качестве ресурса содержимое аргумента Data
procedure ExportData(Path, AName, AType: String; data: TFileStream); overload;
var
  hFile: HWND;
  Buf: array of Byte;
begin
  hFile := BeginUpdateResource(PChar(Path), False);
  try
    if hFile = 0 then
    begin
      RaiseLastOSError;
    end;
    SetLength(Buf, data.Size);
    data.Position := 0;
    data.Read(Buf[0], data.Size);
    if not UpdateResource(hFile, PChar(AType), PChar(AName), 0, @Buf[0],
      data.Size) then
      RaiseLastOSError;
    Finalize(Buf);
  finally
    EndUpdateResource(hFile, False);
  end;
end;
 
// пример использования
// data := TFileStream.Create('c:\1.txt', fmOpenRead);
// try
// ExportData('c:\test.exe', 'test', 'sometype', data);
// finally
// data.Free;
// end;
 
//извлекает ресурс с именем 'test'
procedure ExtractRes(Path: String);
begin
  ForceDirectories(Path);
  with TResourceStream.Create(HInstance, 'test', 'sometype') do
    try
      Position := 0;
      SaveToFile(Path + '1.txt');
    finally
      Free;
    end;
end;
 
//получить список ресурсов файла
function GetResourceList: Boolean;
var
  Errors: Cardinal;
  ResourceName:array of ShortString;
 
  function CallBack(hModule: hModule; lpType: PChar; lpzName: LPTSTR;
    lParam: Longint): BOOL; stdcall;
  var
    Size: Cardinal;
  begin
    Result := True;
    if Assigned(lpzName) then
    begin
      Size := Length(ResourceName);
      Inc(Size);
      SetLength(ResourceName, Size);
      ResourceName[Size - 1] := ShortString(lpzName);
    end;
  end;
 
begin
  Result := True;
  ResourceName := nil;
  Errors := 0;
  EnumResourceNames(HInstance, 'sometype', @CallBack, 0);
end;
0
2644 / 2267 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
04.03.2015, 15:13 17
Цитата Сообщение от Shakielpel Посмотреть сообщение
hFile: HWND;
Не принципиально, но почему WND ?
Дескриптор файлового ресурса - это же не дескриптор оконного ресурса)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2015, 15:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

При копировании exe файла с другого компа на котором он работает, на моём при его запуске открывается cmd на несколько секунд и сам exe файл удаляется
Помогите очень надо!!! Дело в следующем: в автошколе на компах установлены программы для...

Как, не меняя и не переставляя главный EXE-файл, при его запуске запускать другие программы?
Здравствуйте! Задачка такая. Есть у меня файл, скажем "D:\Files\example.exe". Нужно сделать так,...

Присоединить DLL на C# к EXE файлу
Здраствуйте, я хотел присоединить DLL на C# к EXE файлу (в виде модуля), но мне написало что...

Удаление на ПК с Windows XP одного-единственного EXE-файла при его запуске
Необходим батник, который удалит на машине один экзешный файл (программа версии портейбл) при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.