| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как дописать в ехе файл данные |
| Автор: SAVe 8.11.2007, 10:46 |
| Здравствуйте. Есть такая проблема: Есть готовый ехе файл. Для его работы нужны справочники которые генерируются из БД в виде XML файлов. Нужно каким то образом засунуть их в сам ехе файл. Ну и естественно он должен при запуске прочитать эти данные. Хотелось бы записать это в ресурсы . Подскажите пожалуйста как это сделать? Где можно найти информацию по фомату ехе файла (где код , где ресурсы , где данные)? |
| Автор: chaos 8.11.2007, 12:04 |
| даже если у Вас получится засунуть данные в ехе файл(в чом сомневаюсь). Вам придется еще править код! те программа должна знать откуда брать Ваши данные. ИМХО "не ищите легких путей" |
| Автор: chaos 8.11.2007, 12:30 | ||
вопрос на засыпку: что делать если исходников у вас нет? |
| Автор: SAVe 8.11.2007, 12:37 |
| Спасибо Peter . Я то же склонялся к именно такой реализации. Смущает только вот что - не загрузятся ли данные которые я приклею в сегмент кода или данных ? |
| Автор: chaos 8.11.2007, 12:41 |
| SAVe, не совсем понятно что вы хотите: сначала вы говорите что Есть готовый ехе файл потом вы говорите что метод подходит и последнее: если генерируются данные из БД - как часто вы будете извращатся таким способом - засовывая данные в ехе ? |
| Автор: Peter 8.11.2007, 12:41 | ||
Об этом речи не было.
С какой стати? EXE-шник сам по себе останется нетронутым. Если сзади что-то приклеить, в работе программы ничего не собьётся. |
| Автор: chaos 8.11.2007, 12:47 | ||||
|
| Автор: SAVe 8.11.2007, 13:19 | ||
| Извините если немного некорректно обЪяснил... Внесу некоторую ясность.
Имеется ввиду что я сам его собираюсь сделать (т.е. исходники будут). Но данные с которыми он работает (XML справочники) могут меняться. Клиенту же (их много) нужно выдать только ехе , а не ехе и набор XML файлов. Поэтому делать это (брать данные из базы и дописывать в ехе) прийдётся часто. Если же дописанные данные на работе ехе файла никак не отразятся - то это вполне подходящий вариант. Если кто знает как всё это добро (XML справочники) засунуть в ресурсы ехе файла или изменить сегмент данных программы - расскажите как . И если кто в курсе где посмотреть формат ехе файла ,то же киньте ссылочку пожалуйста. |
| Автор: bsa 8.11.2007, 14:22 |
| SAVe, в комплекте с твоей средой разработки должен поставляться компилятор ресурсов. Найди формат RC файлов (исходник ресурсного). Там все достаточно просто. тебе нужно будет из XML делать RC, затем RC скомпилировать в RES, и RES прилинковать к программе во время сборки. Имхо, проще воспользоваться WinRAR. Создаешь SFX архив и пишешь простейший скрипт на языке этого WinRAR SFX, который после распаковки запустит твою прогу, а после завершения удалит все за собой. |
| Автор: xvr 8.11.2007, 16:19 | ||
См. функции BeginUpdateResource, UpdateResource и EndUpdateResource Для доступа - как обычно LoadResource |
| Автор: SAVe 9.11.2007, 18:10 |
| Пошел по по пути использовнаия BeginUpdateResource, UpdateResource и EndUpdateResource. Сделал 2 ехе файла ехе1 и ехе2. Один (ехе1) содержит ресурс который нужно обновить. Второй файл (ехе2) пытается при старте обновить этот ресурс в файле ехе1. Всё отрабатывае. Все проверки показывают что обновление прошло удачно. Но ресурсы файла ехе1 почему то не обновляются. Почему ? Что не так делаю ? Попутно ещё вопрос - как достать пустой ресурс ? Т.е. если в нём пусто он не отображается на вкладке resources. Хотя имеет ID (только чека выставлена unused). Функция FindResource его не находит. Как его сделать используемым ? |
| Автор: xvr 9.11.2007, 22:39 | ||||||
Телепатов нет - код на бочку, будем изучать
|
| Автор: SAVe 12.11.2007, 16:51 | ||||
| Привожу код: В ехе1 просто читаю ресурс (предварительно добавил его конечно т.е. он не пустой):
Текст выводится. В ехе2 делаю так (в ехе2 содержится свой ресурс IDR_XML1 который я пытаюсь записать в ехе1):
Вроде бы всё благополучно проходит. Реально же при старте ехе1 выводится испорченный текст ресурса (дописана к исходному тексту какая то ерунда). При установке в функции BeginUpdateResource (..., TRUE) файл ехе1 просто портится и не стартует. Проверяю сам код файла exe1 (test.exe). Там в конец файла дописан правильный текст. Но за ним куча какого то левого текста PADDINGX |
| Автор: xvr 12.11.2007, 17:52 | ||||||||||||||
Согласно Талмуду (MSDN) чтение ресурса должно проводится так:
Кроме того, параметр lpData функции UpdateResource:
|
| Автор: SAVe 13.11.2007, 19:06 | ||||
| Вобщем о том как в итоге проблема была "зарыта в могилу" (может кому пригодится). Итак с BeginUpdateResource, UpdateResource и EndUpdateResource всё таки ничего не получилось. Пришлось разбираться с форматом Portable Executable ( поиск по строке PE в MSDN выдаёт нужные статьи). Идея вот в чём : Сами данные записываем просто в конец файла (В любом виде. Я просто строки писал). Но возникает проблема - с какого адреса ( с какого смещения в файле ) нужно читать свои данные ? Для определения этого смещения пришлось проанализировать заголовок файла и определить где заканчивается последний блок данных которые были записаны при компиляции. Вот код ехе2 который модифицируе файл ехе1 дописывая данные в его конец:
Вот код который находит "оригинальный " конец файла ехе1 (при старте самого ехе1 )и читает новые данные:
У меня получилось так. Желаю удачи всем тем кто захочет это использовать. Спасибо всем кто поучаствовал в обсуждении темы. |