Существует готовый exe файл. Нужно в ресурсе version этого файла программно изменить коментарии (пункт Comments). Пробовал способо описанным здесь http://www.codeproject.com/samples/UpdateVersion.asp не получилось, exe-шник перестает запускаться после внесения изменений.
Здравствуйте, stepaster, Вы писали:
S>Существует готовый exe файл. Нужно в ресурсе version этого файла программно изменить коментарии (пункт Comments). Пробовал способо описанным здесь http://www.codeproject.com/samples/UpdateVersion.asp не получилось, exe-шник перестает запускаться после внесения изменений.
Разбирался я с такой штукой. Вот движок разбора/замены/сбора VERSION_INFO:
Возникло несколько вопросов.
1. Что за класс базовый класс VObject у VVersionInfo и VCommonVersionInfo?
2. Не понятнно что тип QBuffer у переменной VCommonVersionInfo::m_Value. Я реализовал этот тип так
3. Не знаю что такое VArray поэтому вместо
typedef VArray <VVersionInfo*> VChilds;
использовал vector из STL
typedef std::vector<VVersionInfo*> VChilds;
Надеюсь это тоже не отразилось на функциональности
4. Для того что бы заработало дополнил ваш код из примера.
При этом при попытке выполнить
pFixed->dwProductVersionMS = pFixed->dwProductVersionMS + 0x00010001;//m_dwVersionMS;
Появляется окно с Accecc Violation
Я думаю что это связано с тем что слишком рано выполняется FreeLibrary. Но даже если выполнить закрытие библиотеки после всех операций все равно происходит что-то не очень понятное. После обновления ресурса сам файл остается неизменным но в том же каталоге появляется новый с именем RCXxxx.TMP
Последние три xxx в имени файла это шестнадцатиричное число, которое каждый раз изменяется на новое. Если этот файл переименовать в exe то он не запускается.
S>Возникло несколько вопросов. S>1. Что за класс базовый класс VObject у VVersionInfo и VCommonVersionInfo?
Обычный базовый класс "всего". Можно игнорировать... S>2. Не понятнно что тип QBuffer у переменной VCommonVersionInfo::m_Value. Я реализовал этот тип так
Это просто буфер на н-цать байт. В отличии от восстановленного варианта содержит копию данных S>
S>3. Не знаю что такое VArray поэтому вместо S> typedef VArray <VVersionInfo*> VChilds; S> использовал vector из STL S> typedef std::vector<VVersionInfo*> VChilds; S> Надеюсь это тоже не отразилось на функциональности
Вполне подойдёт...
S>4. Для того что бы заработало дополнил ваш код из примера.
S> При этом при попытке выполнить S> pFixed->dwProductVersionMS = pFixed->dwProductVersionMS + 0x00010001;//m_dwVersionMS; S> Появляется окно с Accecc Violation S> Я думаю что это связано с тем что слишком рано выполняется FreeLibrary. Но даже если выполнить закрытие библиотеки после всех операций все равно происходит что-то не очень понятное. После обновления ресурса сам файл остается неизменным но в том же каталоге появляется новый с именем RCXxxx.TMP S> Последние три xxx в имени файла это шестнадцатиричное число, которое каждый раз изменяется на новое. Если этот файл переименовать в exe то он не запускается.
Падает из-за обращения к памяти, ранее принадлежавшей выгруженной библиотеке. Если QBuffer будет хранить копию — ничего не должно падать...
Re[4]: Программно изменить коментрарии к версии
От:
Аноним
Дата:
24.08.06 08:49
Оценка:
Здравствуйте, McQwerty, Вы писали:
S>>Возникло несколько вопросов. S>>1. Что за класс базовый класс VObject у VVersionInfo и VCommonVersionInfo? MQ>Обычный базовый класс "всего". Можно игнорировать... S>>2. Не понятнно что тип QBuffer у переменной VCommonVersionInfo::m_Value. Я реализовал этот тип так MQ>Это просто буфер на н-цать байт. В отличии от восстановленного варианта содержит копию данных S>>
S>>3. Не знаю что такое VArray поэтому вместо S>> typedef VArray <VVersionInfo*> VChilds; S>> использовал vector из STL S>> typedef std::vector<VVersionInfo*> VChilds; S>> Надеюсь это тоже не отразилось на функциональности MQ>Вполне подойдёт...
S>>4. Для того что бы заработало дополнил ваш код из примера.
S>> При этом при попытке выполнить S>> pFixed->dwProductVersionMS = pFixed->dwProductVersionMS + 0x00010001;//m_dwVersionMS; S>> Появляется окно с Accecc Violation S>> Я думаю что это связано с тем что слишком рано выполняется FreeLibrary. Но даже если выполнить закрытие библиотеки после всех операций все равно происходит что-то не очень понятное. После обновления ресурса сам файл остается неизменным но в том же каталоге появляется новый с именем RCXxxx.TMP S>> Последние три xxx в имени файла это шестнадцатиричное число, которое каждый раз изменяется на новое. Если этот файл переименовать в exe то он не запускается.
MQ>Падает из-за обращения к памяти, ранее принадлежавшей выгруженной библиотеке. Если QBuffer будет хранить копию — ничего не должно падать...
У Вас есть функции для замены.
А как добавить новый комментарий к версии файла?
Существует ли реализация этой футкции?
Если есть сообщите пожалуйста.
А>У Вас есть функции для замены. А>А как добавить новый комментарий к версии файла? А>Существует ли реализация этой футкции? А>Если есть сообщите пожалуйста.
Да. Это возможно.
Все строки, которые будут записаны в ресурсы, содержатся в массиве m_Childs
класса VVersionInfo. Соответственно, если в этот массив добавить ещё один
элемент, то при выполнении функции Compile, он будет добавлен в ресурсы.
Сделать это можно примерно так:
VVersionInfo ver (pVer);
ver. m_Childs. Add (new VVersionInfo ("NewStr", "NewVal"));
Конструктор от двух строк для VVersionInfo придётся добавить самому — у
меня его нет.
Re[6]: Программно изменить коментрарии к версии
От:
Аноним
Дата:
30.08.06 06:31
Оценка:
Здравствуйте, McQwerty, Вы писали:
А>>У Вас есть функции для замены. А>>А как добавить новый комментарий к версии файла? А>>Существует ли реализация этой футкции? А>>Если есть сообщите пожалуйста.
MQ>Да. Это возможно. MQ>Все строки, которые будут записаны в ресурсы, содержатся в массиве m_Childs MQ>класса VVersionInfo. Соответственно, если в этот массив добавить ещё один MQ>элемент, то при выполнении функции Compile, он будет добавлен в ресурсы.
MQ>Сделать это можно примерно так: MQ>VVersionInfo ver (pVer); MQ>ver. m_Childs. Add (new VVersionInfo ("NewStr", "NewVal"));
MQ>Конструктор от двух строк для VVersionInfo придётся добавить самому — у MQ>меня его нет.
Спасибо за ответ.
Коструктор VVersionInfo имеет следующую реализацию
Здравствуйте, stepaster, Вы писали:
S>Существует готовый exe файл. Нужно в ресурсе version этого файла программно изменить коментарии (пункт Comments). Пробовал способо описанным здесь http://www.codeproject.com/samples/UpdateVersion.asp не получилось, exe-шник перестает запускаться после внесения изменений.
Если цель состоит в том, чтобы просто програмно (из скрипта например) изменить информацию о версии (комментарий) в экзешнике,
а не написать собственную программу, которая это делает, то IMHO намного проще будет ResHack использовать...
Все делается из командной строки.