Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как дописать в ехе файл данные, Запись XML справочников 
:(
    Опции темы
SAVe
Дата 8.11.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Здравствуйте.

Есть такая проблема:

Есть готовый ехе файл. Для его работы нужны справочники которые генерируются из БД в виде XML файлов. Нужно каким то образом засунуть их в сам ехе файл. Ну и естественно он должен при запуске прочитать эти данные. Хотелось бы записать это в ресурсы .  Подскажите пожалуйста как это сделать? Где можно найти  информацию  по фомату ехе файла (где код , где ресурсы , где данные)?
PM MAIL   Вверх
chaos
Дата 8.11.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



даже если у Вас получится засунуть данные в ехе файл(в чом сомневаюсь). Вам придется еще править код! те программа должна знать откуда брать Ваши данные.

ИМХО "не ищите легких путей"
PM WWW   Вверх
Peter
Дата 8.11.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Цитата(chaos @  8.11.2007,  12:04 Найти цитируемый пост)
даже если у Вас получится засунуть данные в ехе файл(в чом сомневаюсь). Вам придется еще править код! те программа должна знать откуда брать Ваши данные

На самом деле этот вариант не такой уж и страшный. Я им пользовался.
В программе заводим переменную целого типа, в которую вносим размер exe-шника в байтах. После компиляции сверяем правильность её значения; если оно не такое, то исправляем и перекомпилируем - от этого размер программы не меняется. Внутри программы открываем сам exe-шник через fopen или что-нибудь подобное (GetModuleFileName поможет нам получить путь к нему) и читаем данные, начиная с указанной позиции. Осталось не забыть приклеить данные сзади к exe-шнику.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
chaos
Дата 8.11.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата(Peter @ 8.11.2007,  14:24)
В программе заводим переменную целого типа

вопрос на засыпку: что делать если исходников у вас нет?
PM WWW   Вверх
SAVe
Дата 8.11.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Спасибо Peter . Я то же склонялся к именно такой реализации. Смущает только вот что - не загрузятся ли данные которые я приклею в сегмент кода или данных ?



PM MAIL   Вверх
chaos
Дата 8.11.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



SAVe, не совсем понятно что вы хотите:
сначала вы говорите что Есть готовый ехе файл потом вы говорите что метод подходит и последнее: если генерируются данные из БД - как часто вы будете извращатся таким способом - засовывая данные в ехе ?

PM WWW   Вверх
Peter
Дата 8.11.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Цитата(chaos @  8.11.2007,  12:30 Найти цитируемый пост)
вопрос на засыпку: что делать если исходников у вас нет?

Об этом речи не было.

Цитата(SAVe @  8.11.2007,  12:37 Найти цитируемый пост)
не загрузятся ли данные которые я приклею в сегмент кода или данных ?

С какой стати? EXE-шник сам по себе останется нетронутым. Если сзади что-то приклеить, в работе программы ничего не собьётся.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
chaos
Дата 8.11.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата(Peter @ 8.11.2007,  14:41)
Об этом речи не было.


Цитата(SAVe @ 8.11.2007,  12:46)

Есть готовый ехе файл. 


Это сообщение отредактировал(а) chaos - 8.11.2007, 12:48
PM WWW   Вверх
SAVe
Дата 8.11.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Извините если немного некорректно обЪяснил...
Внесу некоторую ясность.

Цитата

Есть готовый ехе файл. 


 
Имеется ввиду что я сам его собираюсь сделать (т.е. исходники будут).  Но данные с которыми он работает (XML справочники) могут меняться. Клиенту же (их много) нужно выдать только ехе , а не ехе и набор  XML файлов. Поэтому делать это (брать данные из базы и дописывать в ехе) прийдётся часто. 

Если же дописанные данные на работе ехе файла никак не отразятся - то это вполне подходящий вариант.

Если кто знает как всё это добро (XML справочники)  засунуть в ресурсы ехе файла или изменить сегмент данных программы - расскажите как . И если кто в курсе где посмотреть формат ехе файла ,то же киньте ссылочку пожалуйста.

PM MAIL   Вверх
bsa
Дата 8.11.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



SAVe, в комплекте с твоей средой разработки должен поставляться компилятор ресурсов. Найди формат RC файлов (исходник ресурсного). Там все достаточно просто. тебе нужно будет из XML делать RC, затем RC скомпилировать в RES, и RES прилинковать к программе во время сборки.

Имхо, проще воспользоваться WinRAR. Создаешь SFX архив и пишешь простейший скрипт на языке этого WinRAR SFX, который после распаковки запустит твою прогу, а после завершения удалит все за собой.
PM   Вверх
xvr
Дата 8.11.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(SAVe @ 8.11.2007,  10:46)
Здравствуйте.

Есть такая проблема:

Есть готовый ехе файл. Для его работы нужны справочники которые генерируются из БД в виде XML файлов. Нужно каким то образом засунуть их в сам ехе файл. Ну и естественно он должен при запуске прочитать эти данные. Хотелось бы записать это в ресурсы .  Подскажите пожалуйста как это сделать? Где можно найти  информацию  по фомату ехе файла (где код , где ресурсы , где данные)?

См. функции BeginUpdateResource, UpdateResource  и EndUpdateResource
Для доступа - как обычно LoadResource
PM MAIL   Вверх
SAVe
Дата 9.11.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Пошел по по пути использовнаия BeginUpdateResource, UpdateResource  и EndUpdateResource.
Сделал 2 ехе файла ехе1 и ехе2. Один (ехе1) содержит ресурс который нужно обновить. Второй файл  (ехе2) пытается при старте обновить этот ресурс в файле ехе1.
Всё  отрабатывае. Все проверки показывают что обновление прошло удачно. Но ресурсы файла ехе1 почему то не обновляются. Почему ? Что не так делаю ?

Попутно ещё вопрос - как достать пустой ресурс  ? Т.е. если в нём пусто он не отображается на вкладке resources. Хотя имеет ID (только чека выставлена unused).  Функция FindResource его не находит. Как его сделать используемым ?

PM MAIL   Вверх
xvr
Дата 9.11.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(SAVe @ 9.11.2007,  18:10)
Пошел по по пути использовнаия BeginUpdateResource, UpdateResource  и EndUpdateResource.
Сделал 2 ехе файла ехе1 и ехе2. Один (ехе1) содержит ресурс который нужно обновить. Второй файл  (ехе2) пытается при старте обновить этот ресурс в файле ехе1.
Всё  отрабатывае. Все проверки показывают что обновление прошло удачно. Но ресурсы файла ехе1 почему то не обновляются. Почему ? Что не так делаю ?

Телепатов нет - код на бочку, будем изучать smile

Цитата

Попутно ещё вопрос - как достать пустой ресурс  ? Т.е. если в нём пусто он не отображается на вкладке resources. Хотя имеет ID (только чека выставлена unused).  Функция FindResource его не находит.
Судя по всему в выходном exe его нет совсем. То что студия зарезервировала ID для него, еще не значит, что линкер поместил то, чего нет в выходной файл.
Цитата

Как его сделать используемым ?
Добавить какое-нибудь содержимое.
PM MAIL   Вверх
SAVe
Дата 12.11.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 15.10.2007

Репутация: нет
Всего: нет



Привожу код:

В ехе1 просто читаю ресурс (предварительно добавил его конечно т.е. он не пустой):

 
Код

::OnInitDIalog()
{

.....

HINSTANCE hInst = ::GetModuleHandle(NULL);
    HRSRC hRes = ::FindResource(hInst,MAKEINTRESOURCE(130),"XML");
    LPVOID  pRes = (LPVOID)::LoadResource(hInst,hRes);

    char* pData = (char*)pRes;

// Текст выводится
    MessageBox(pData);
.....
}


Текст выводится.

В ехе2 делаю так (в ехе2 содержится свой ресурс IDR_XML1 который я пытаюсь записать в ехе1):

Код


// Читаю новый текст ресурса который нужно записать в ехе1
HMODULE hInst = ::AfxGetInstanceHandle();
    HRSRC hRes = ::FindResource(hInst,MAKEINTRESOURCE(IDR_XML1),"XML");
    LPVOID  pRes = (LPVOID)::LoadResource(hInst,hRes);
// Размер новых данных
    DWORD resSize = ::SizeofResource(hInst,hRes);
    char * pData = (char*)pRes ;
    
// Новый текст ресурса выводится
    MessageBox(pData);

// Получаю  HANDLE файла в котором нужно обновить ресурсы
    HANDLE resHandle = ::BeginUpdateResource("d:\\Test\\Debug\\Test.exe",FALSE);

//resHandle не NULL

        BOOL UpdRes = ::UpdateResource(resHandle,MAKEINTRESOURCE
(130),"XML",MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),pData,resSize);

// UpdRes после выполнения = 1


        BOOL EndRes = ::EndUpdateResource(resHandle,FALSE);
// EndRes после выполнения = 1



Вроде бы всё благополучно проходит.

Реально же при старте ехе1 выводится испорченный текст ресурса (дописана к исходному тексту какая то ерунда). При установке в функции 
BeginUpdateResource (..., TRUE) файл ехе1 просто портится и не стартует. 

Проверяю сам код файла exe1 (test.exe). Там в конец файла дописан правильный текст. Но за ним куча какого то левого текста PADDINGX

PM MAIL   Вверх
xvr
Дата 12.11.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(SAVe @ 12.11.2007,  16:51)
В ехе2 делаю так (в ехе2 содержится свой ресурс IDR_XML1 который я пытаюсь записать в ехе1):

Код


// Читаю новый текст ресурса который нужно записать в ехе1
HMODULE hInst = ::AfxGetInstanceHandle();
    HRSRC hRes = ::FindResource(hInst,MAKEINTRESOURCE(IDR_XML1),"XML");


Согласно Талмуду (MSDN) чтение ресурса должно проводится так:

Код

HGLOBAL hg = (LPVOID)::LoadResource(hInst,hRes);
LPVOID pRes=LockResource(hg);

Кроме того, параметр lpData функции UpdateResource:
Цитата

Pointer to the resource data to be inserted into the executable file. If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data stored in the executable file, not the data provided by LoadIcon, LoadString, or other resource-specific load functions. All data containing strings or text must be in Unicode format; lpData must not point to ANSI data.
, не знаю, считает ли Windows ресурс с типом 130 - string or text. Можно попробовать тип ресурса RT_RCDATA (над ним точно издеваться не будут)
Цитата

Вроде бы всё благополучно проходит.
Реально же при старте ехе1 выводится испорченный текст ресурса (дописана к исходному тексту какая то ерунда). 
Похоже ресурс дописывается в хвост к предыдущему содержимому - попробуй сначала удалить предыдущее содержимое (вызвав UpdateResource с NULL в качестве lpData)
Цитата

При установке в функции 
BeginUpdateResource (..., TRUE) файл ехе1 просто портится и не стартует. 
Еще бы - ты ему ВСЕ ресурсы убил.
Цитата

Проверяю сам код файла exe1 (test.exe). Там в конец файла дописан правильный текст. Но за ним куча какого то левого текста PADDINGX
Это нормально

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1939 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.