Изменение данных о версии модуля.
От: Бодряк  
Дата: 21.11.02 19:16
Оценка:
Получить информацию о версии EXE-модуля (и ему подобных) из ресурса VS_VERSION_INFO программно весьма просто. В MSDN'e об этом весьма культурно все расписано.
У меня такой вопрос: как можно исправлять/добавлять/удалять ее в ходе выполнения программы, а не обыкновенным редактированием файла version.rc?
Может кто сталкивался с этой проблемой и знает как ее решить. Спасибо!
Re: Изменение данных о версии модуля.
От: Patalog Россия  
Дата: 22.11.02 06:13
Оценка:
Здравствуйте, Бодряк, Вы писали:

Б>Получить информацию о версии EXE-модуля (и ему подобных) из ресурса VS_VERSION_INFO программно весьма просто. В MSDN'e об этом весьма культурно все расписано.

Б>У меня такой вопрос: как можно исправлять/добавлять/удалять ее в ходе выполнения программы, а не обыкновенным редактированием файла version.rc?
Б> Может кто сталкивался с этой проблемой и знает как ее решить. Спасибо!

Может подойдут
BeginUpdateResource
UpdateResource
EndUpdateResource
?
Почетный кавалер ордена Совка.
Re[2]: Изменение данных о версии модуля.
От: Бодряк  
Дата: 22.11.02 07:10
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Может подойдут

P>BeginUpdateResource
P>UpdateResource
P>EndUpdateResource
P>?

Я тоже пришел к выводу, что это и нужно но штука в том, что мы передаем в UpdateResource?

BOOL UpdateResource(
HANDLE hUpdate, // update-file handle
LPCTSTR lpType, // resource type
LPCTSTR lpName, // resource name
WORD wLanguage, // language identifier
LPVOID lpData, // resource data
DWORD cbData // length of resource data
);

Я имею в виду указатель на новое значение данных (lpData) Получить его можно (например, через GetFileVersionInfo(...)), но как его правильно подредактировать???
Re[3]: Изменение данных о версии модуля.
От: Patalog Россия  
Дата: 22.11.02 08:55
Оценка: 13 (2)
Здравствуйте, Бодряк, Вы писали:

const int name_size = MAX_PATH;
TCHAR file_name[name_size] = { 0 };
lstrcpy(file_name, "my_cool_app.exe");

DWORD unused = 0;
DWORD version_size = GetFileVersionInfoSize(file_name, &unused);
_ASSERTE(version_size);

unsigned char* version_info = new unsigned char[version_size];
BOOL res = GetFileVersionInfo(file_name, 0, version_size, version_info);
_ASSERTE(res);

VS_FIXEDFILEINFO* fixed_info = NULL;
UINT block_len = 0;
res = VerQueryValue(version_info, "\\", reinterpret_cast<void**>(&fixed_info), &block_len);
_ASSERTE(res);

++fixed_info->dwFileVersionLS;

HANDLE resource = BeginUpdateResource(file_name, FALSE);
_ASSERTE(resource);

res = UpdateResource(resource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), version_info, version_size);
_ASSERTE(resource);

res = EndUpdateResource(resource, FALSE);
_ASSERTE(resource);

delete [] version_info;
Почетный кавалер ордена Совка.
Re[4]: А как поменять строковый параметр
От: Disappear  
Дата: 20.02.04 18:18
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, Бодряк, Вы писали:


С VS_FIXEDFILEINFO все работает, а мне нужно поменять строковый параметр (VALUE)
к примеру
VerQueryValue(handle, "\\StringFileInfo\\<codepage>\\ProductVersion",..

функция выдаст ptr, но его изменение никак не повлияет на результат
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.