Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
#1

Утилита для правки номера версии (без перестроения) - C++

18.03.2008, 13:37. Просмотров 772. Ответов 6
Метки нет (Все метки)

Мне приходится перестраивать весь проект лишь для того чтобы поменять номер версии. Как сделать программу которая залезла бы в ехе-шник и поменяла бы номер версии. Конкретно возникла проблема с записью в VC_VERSION_INFO.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2008, 13:37     Утилита для правки номера версии (без перестроения)
Посмотрите здесь:

C++ Генератор слов для телефонного номера
C++ процедура без глобальных переменных для вывода суммы элементов матрицы и номера строки с минимальной суммой элементов
C++ Утилита для просмотра DLL
Заменить отрицательные элементы суммой номера столбца и номера строки, в которых они находятся C++
C++ консольная утилита
Библиотека/утилита для извления flv (флэш) контента из html страницы C++
C++ Задачка на строки (преобразовать множество старых программ для новой версии компилятора)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnTr
Сообщений: n/a
18.03.2008, 14:36     Утилита для правки номера версии (без перестроения) #2
Хaллo!
Нaдеюсъ этo пoмoжет:

Глaвнaя прoгрaммa:
C++
1
2
3
4
5
6
7
8
9
#include 'stdafx.h'
#include <conio.h>
 
int main(int argc, char* argv[])
{
    printf('Versionnummer: 0');
    getch();
    return 0;
}
>резулътaт TestVersion.exe

Patch прoгрaммa:
C++
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
#include 'stdafx.h'
#include 'iostream.h'
#include <string.h>
 
bool PatchFile(const char* p_pkcFilename)
{
    FILE* pFile=fopen(p_pkcFilename, 'rb');
    if(!pFile) {return false;};
    fseek(pFile, 0, SEEK_END);
    int iSize = ftell(pFile);
    fseek(pFile, 0, SEEK_SET);
    char* cpBuffer = new char[iSize];
    fread(cpBuffer, iSize, 1, pFile);
    fclose(pFile);
    pFile=fopen(p_pkcFilename, 'wb');
    int i;
    char sT[] = 'Versionnummer: ';
    for(i=0;i<iSize;i++)
    {
        if(strnicmp(cpBuffer+i, sT, strlen(sT))==0)
        {
            sprintf(cpBuffer+i+strlen(sT), ' %d', 666);         
        };
    };
    fwrite(cpBuffer, iSize, 1, pFile);
    delete [] cpBuffer;
    fclose(pFile);
    return true;
};
 
int main(int argc, char* argv[])
{
    if(!PatchFile('TestVersion.exe'))
    {
        printf('Error');
        return 0;
    };
    printf('OK');
    return 0;
}
VVP
Сообщений: n/a
18.03.2008, 15:05     Утилита для правки номера версии (без перестроения) #3
2AnTr: Вы вопрос-от поняли?

2petrovich1: Если разрабатываешь в MSVC, то открываешь нужный exe-шник как resources, получаешь список ресурсов, находишь ресурс типа VERSION - правишь и сохраняешь изменения. Все это прямо в IDE.
Таким-же образом можно (и нужно) корректировать ресурсы сторонних exe-шников, не забывай делать резервные копии и правильно устанавливать язык ресурса.
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
18.03.2008, 19:37  [ТС]     Утилита для правки номера версии (без перестроения) #4
Нужна утилита которой можно передать в качестве параметра новый номер билда. ПИШЕШЬ в командной строке цифру (номер версии), нажимаешь ЭНТЕР и твой проект начисто сменил значения полей fileVersion и productVersion.
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
18.03.2008, 19:39  [ТС]     Утилита для правки номера версии (без перестроения) #5
Вот прога:
(Только не надо обвинять в незнании языка, я её взял из Хелпа)
C++
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include 'stdafx.h'
 
void ErrorHandler(char buf[256])
{
    MessageBox(NULL, buf, 'ГЋГёГЁГЎГЄГ*', MB_OK);
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    HGLOBAL hResLoad;     // handle to loaded resource 
    HINSTANCE hExe;        // handle to existing .EXE file 
    HRSRC hRes;         // handle/ptr. to res. info. in hExe 
    HANDLE hUpdateRes;  // update resource handle 
    VOID* lpResLock;    // pointer to resource data 
    BOOL result; 
 
    // Load the .EXE file that contains the dialog box you want to copy. 
    hExe = LoadLibrary('DLG2.exe'); 
 
    if (hExe == NULL) 
    { 
        ErrorHandler('Could not load exe.'); 
        return 0;
    } 
 
    // Locate the dialog box resource in the .EXE file. 
    hRes = FindResource(hExe, 'AboutBox', RT_DIALOG); 
 
    if (hRes == NULL) 
    { 
        ErrorHandler('Could not locate dialog box.'); 
    } 
 
    // Load the dialog box into global memory. 
    hResLoad = LoadResource(hExe, hRes); 
 
    if (hResLoad == NULL) 
    { 
        ErrorHandler('Could not load dialog box.'); 
        return 0;
    } 
 
    // Lock the dialog box into global memory. 
    lpResLock = LockResource(hRes); 
 
    if (lpResLock == NULL) 
    { 
        ErrorHandler('Could not lock dialog box.'); 
        return 0;
    } 
 
    // Open the file to which you want to add the dialog box resource. 
    hUpdateRes = BeginUpdateResource('DLG1.exe', FALSE); 
 
    if (hUpdateRes == NULL) 
    { 
        ErrorHandler('Could not open file for writing.'); 
        return 0;
    } 
 
    // Add the dialog box resource to the update list. 
    result = UpdateResource(hUpdateRes,       // update resource handle 
         RT_DIALOG,                   // change dialog box resource 
         'AboutBox',                  // dialog box name 
         MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),  // neutral language
         lpResLock,                   // ptr to resource info 
         SizeofResource(hExe, hRes)); // size of resource info. 
 
    if (result == FALSE) 
    { 
        ErrorHandler('Could not add resource.'); 
    } 
 
    // Write changes to FOOT.EXE and then close it. 
    if (!EndUpdateResource(hUpdateRes, FALSE)) 
    { 
        ErrorHandler('Could not write changes to file.'); 
    } 
 
    // Clean up. 
    if (!FreeLibrary(hExe)) 
    { 
        ErrorHandler('Could not free executable.'); 
    } 
 
 
        return 0;
}
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
18.03.2008, 19:42  [ТС]     Утилита для правки номера версии (без перестроения) #6
Как видите всё очень просто! Но не работает ф-я LockResource.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2008, 19:53     Утилита для правки номера версии (без перестроения)
Еще ссылки по теме:

C++ Очень нужна простейшая системная утилита для Windows на С++
C++ Выбор версии компилятора для онлайн проверки кода
C++ Найти номера ячеек с числами без остатка делящихся на 3
Запишите рекуррентное уравнение для времени работы этой рекурсивной версии алгоритма сортировки вставкой C++
C++ Вывести данные и их порядковые номера без использования массива

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

Или воспользуйтесь поиском по форуму:
VVP
Сообщений: n/a
18.03.2008, 19:53     Утилита для правки номера версии (без перестроения) #7
В ф-цию LockResource надо передать результат работы ф-ции LoadResource, т.е. переменную hResLoad.

Удачи.
Yandex
Объявления
18.03.2008, 19:53     Утилита для правки номера версии (без перестроения)
Ответ Создать тему
Опции темы

Текущее время: 04:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru