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

Как правильно сделать самообновление программы? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Подчеркиваются двоеточия в конце строк кода http://www.cyberforum.ru/cpp-beginners/thread1166007.html
хочу научиться программировать скачал Microsoft Visual C++ 2010 Express и видео уроки пишу первую прогу но почему то пишет при компиляции что ошибка или что файл не найден подскажите что не так?
C++ Преобразовать многочлен схемой Горнера и решишь это уравнение рекурсивно Доброго дня. Такая задача, решить рекурсивно следующее выражение ех, оно раскладывается на ех=1+ х/1! + х2/2! + х3/3! + ... + хn/n! + ... = 1 + x/1( 1+x/2 ( 1+x/3 ( 1+... ( 1+x/(n-1)! ( 1+x/n!( 1+... Такая ужасная штука длится бесконечно, нужно преобразовать этот многочлен схемой Горнера и решишь это уравнение рекурсивно. Подскажите как решить кто чем может, спасибо! http://www.cyberforum.ru/cpp-beginners/thread1165991.html
Транспонирование - как вызвать функцию из main C++
Вроде всё правильно но выдаёт ошибку Unresolved external '_main' referenced from C:\PROGRAM FILES (X86)\BORLAND\CBUILDER6\LIB\C0X32.OBJ #include <iostream> #include <cstdlib> using namespace std; const N=3; void trans(double A,double B){ int i,j;
C++ Как работает программа,если можно последовательные этапы, после запуска(что вводить и т.д.)
//--------------------------------------------------------------------------- # include <fstream.h> #include <vcl.h> #pragma hdrstop #include <stdio.h> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm"
C++ Получить новую матрицу, элементы которой равны элементам исходной матрицы, деленные на наименьший http://www.cyberforum.ru/cpp-beginners/thread1165985.html
Дана матрица размером N x M. Найти в ней наименьший элемент. Получить новую матрицу, элементы которой равны элементам исходной матрицы, деленные на наименьший.Все ли правильно я сделал?? #include <iostream.h> #define M 3 #define N 3 #pragma argsused int main(int argc, char* argv) {int i,j,A,min,K; for(i=0;i<M;i++) for(j=0;j<N;j++) { cout<<"\n Vvod elementov matrici=";cin>>A;
C++ Быстрая сортировка, разобрать код По данному коду я изучил принцип быстрой сортировки: #include "stdafx.h" #include <iostream> #include <ctime> using namespace std; const int n=7; int first, last; //функция сортировки void quicksort(int *mas, int first, int last) подробнее

Показать сообщение отдельно
hknower
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 55
04.05.2014, 15:44     Как правильно сделать самообновление программы?
Добрый день

Есть программа которая должна обновляться
Для ясности:
Файл программы старой версии - PROGRAM_NAME
Файл программы новой версии - PROGRAM_NAME_NEW
Решил разделить обновление на 2 этапа:

1) Старая версия программы (PROGRAM_NAME) запускает файл с новой версией программы (PROGRAM_NAME_NEW) с параметром update_stage_1:
Новая версия программы копирует свое содержимое в файл старой программы и запускает его с параметром update_stage_1
2) Запущенная уже обновленная программа (PROGRAM_NAME) удаляет PROGRAM_NAME_NEW/

Написал код, но непонятно что в нем неработает((

По-идее чтобы проверить код нужно чтобы в каталоге лежало 2 собранные программы.
test.exe собранная с PROGRAM_VERSION = 1
test_upated.exe собранная с PROGRAM_VERSION = 2

и запустить "test.exe update"

Где-то не отрабатывает. Подскажите пожалуйста где я ошибыюсь

C++ (Qt)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "stdafx.h"
#include <windows.h>
 
#define PROGRAM_VERSION         1
#define PROGRAM_NAME            L"test.exe"
#define PROGRAM_NAME_NEW        L"test_updated.exe"
 
HANDLE process_start(wchar_t* filepath , wchar_t* params);
void updating(wchar_t* argv_1);
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    if(argc > 1)
    {
        updating(argv[1]);
        return 0;
    }
 
    printf("\nprogram_version=%d\n" , PROGRAM_VERSION);
 
    return 0;
}
 
void updating(wchar_t* argv_1)
{
    
    //Если хотим обновиться. Код запускается в программе которая требует обновление
    if(!wcscmp(argv_1 , L"update"))
    {
        //Тут обновление например скачивается из интернета и складывается в PROGRAM_NAME_NEW
        
        //Запускаем новую версю программы с параметром первого этапа обновления
        process_start(PROGRAM_NAME_NEW , L"update_stage_1");
        return ;
    }
 
    //Этот код отрабатывает в новой версии программы (test_new.exe)
    if(!wcscmp(argv_1 , L"update_stage_1"))
    {
        //Копируем содержимое себя (свего файла на диске - test_new.exe) в test.exe и 
        //запускаем test.exe с параметром update_stage_2
        long updater_len = 0;
        char* update_content = NULL;
 
        printf("\nupdate_stage_1");
 
        //Загружаем в память содержимое самого себя
        FILE* updater_fd = _wfopen(PROGRAM_NAME_NEW , L"rb");
 
        //Если не смогли открыть свой файл-выходим
        if(!updater_fd)
            return ;
 
        fseek(updater_fd , 0 , SEEK_END);
        updater_len = ftell(updater_fd);
        fseek(updater_fd , 0 , SEEK_SET);
        
        update_content = (char*)malloc(updater_len);
        fread(update_content , sizeof(char) , updater_len , updater_fd);
        fclose(updater_fd);
 
        //Записываем себя в оригинальный файл
        FILE* target_updater;
        while((target_updater = _wfopen(PROGRAM_NAME , L"wb")) == 0)
        {
            Sleep(1000);
        }
 
        fwrite(update_content , sizeof(char) , updater_len , target_updater);
        fclose(target_updater);
        
        //Запускаем уже обновленную программу с парметром update_stage_2 и завершаем работу
        process_start(PROGRAM_NAME , L"update_stage_2");
        return ;
    }
 
    //Этот код выполняется уже в обновленной программе
    if(!wcscmp(argv_1 , L"update_stage_2"))
    {
        //Удаляем PROGRAM_NAME_NEW
 
        printf("\nupdate_stage_2");
        
        while(DeleteFile(PROGRAM_NAME_NEW) == 0)
        {
            Sleep(1000);
        }
 
        return ;
    }
 
    //Если запускать с левыми парметрами просто будет прекращать работу
    return ;
}
 
HANDLE process_start(wchar_t* filepath , wchar_t* params)
{
 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    int bWait = 0;
    memset(&si,0,sizeof(si)); 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_HIDE; 
    
    if(CreateProcess(filepath , params , NULL , NULL, FALSE , CREATE_NEW_CONSOLE , NULL , NULL , &si , &pi))
    { 
        if (bWait) WaitForSingleObject(pi.hProcess, INFINITE);
            CloseHandle( pi.hProcess ); 
            CloseHandle( pi.hThread ); 
    } else{return 0;}
 
    return pi.hProcess;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 14:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru