Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,017
#1

Исправить код утилит для обновления - C++

04.08.2015, 16:00. Просмотров 394. Ответов 0
Метки нет (Все метки)

Здравствуйте.
Пишу набор утилит для обновления.
Тут 3 утилиты:

Утилита для копирования:

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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <Windows.h>
#include <iostream>
#include <cstdlib>
#include <sys/stat.h>
 
 
 
BOOL IsRunAsAdmin()
{
    BOOL fIsRunAsAdmin = FALSE;
    DWORD dwError = ERROR_SUCCESS;
    PSID pAdministratorsGroup = NULL;
 
    // Allocate and initialize a SID of the administrators group.
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    if (!AllocateAndInitializeSid(
        &NtAuthority, 
        2, 
        SECURITY_BUILTIN_DOMAIN_RID, 
        DOMAIN_ALIAS_RID_ADMINS, 
        0, 0, 0, 0, 0, 0, 
        &pAdministratorsGroup))
    {
        dwError = GetLastError();
        goto Cleanup;
    }
 
    // Determine whether the SID of administrators group is enabled in 
    // the primary access token of the process.
    if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin))
    {
        dwError = GetLastError();
        goto Cleanup;
    }
 
Cleanup:
    // Centralized cleanup for all allocated resources.
    if (pAdministratorsGroup)
    {
        FreeSid(pAdministratorsGroup);
        pAdministratorsGroup = NULL;
    }
 
    // Throw the error if something failed in the function.
    if (ERROR_SUCCESS != dwError)
    {
        throw dwError;
    }
    return fIsRunAsAdmin;
}
 
 
void OnCommand(int argc, wchar_t *argv[])
{   
            // Check the current process's "run as administrator" status.
            BOOL fIsRunAsAdmin;
            try
            {
                fIsRunAsAdmin = IsRunAsAdmin();
            }
            catch (DWORD dwError)
            {
                MessageBox(NULL, L"Error fIsRunAsAdmin; ", L"UAC", MB_OK);              
            }
 
            // Elevate the process if it is not run as administrator.
            if (!fIsRunAsAdmin)
            {
                wchar_t szPath[MAX_PATH];
                if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
                {
                    // Launch itself as administrator.
                    SHELLEXECUTEINFO sei = { sizeof(sei) };
                    sei.lpVerb = L"runas";
                    sei.lpFile = szPath;
                    sei.hwnd = GetConsoleWindow();
                    sei.nShow = SW_NORMAL;
                    std::wstring s;
 
                    if (argc == 2)
                    {
                        std::cout << "Chosen argc length evaluate: 2"<< std::endl;  
                        s = argv[0] ;
                        s +=  L" ";
                        s += argv[1]; 
                    }
 
                    if(argc == 3)
                    {
                        std::cout << "Chosen argc length evaluate : 3"<< std::endl;  
                        std::wstring s = argv[1] ;
                        s +=  L" ";
                        s += argv[2]; 
                    }
 
                    sei.lpParameters = s.c_str(); 
 
                    if (!ShellExecuteEx(&sei))
                    {
                        DWORD dwError = GetLastError();
                        if (dwError == ERROR_CANCELLED)
                        {
                            // The user refused the elevation.
                            // Do nothing ...
                        }   }
                    else
                    {   EndDialog(GetConsoleWindow(), TRUE);  // Quit itself  
                    }}  }
            else
            {       MessageBox(GetConsoleWindow(), L"The process is running as administrator", L"UAC", MB_OK);
            }   }   
 
 
bool IsPermissionsEnough ()
{   SID_IDENTIFIER_AUTHORITY NtAuthority ;
    GetSidIdentifierAuthority(&NtAuthority);
    return true;}
 
 
int wmain(int argc, wchar_t *argv[])
{
    GUID identifier ;
    CoCreateGuid(&identifier);
    IsPermissionsEnough();
    std::cout << "Count of parameters: " << argc << std::endl;
    std::cout << "argv[]: "  << std::endl;
    for ( int i = 0; i < argc ; i++)
        if (argv[i] != NULL)
        {   std::wstring s = argv[i];
    std::string d(s.begin(), s.end());
    std::cout <<" Argv "<< i << " : " << d.c_str() << std::endl;}
    std::cout << "Before OnCommand " << GetCurrentProcessId() << std::endl;
 
    if (argc == 3) 
    {   OnCommand(argc, argv);  }   
    std::cout << "After OnCommand 1 " << GetCurrentProcessId() << std::endl;    
    int i = -1;
 
    if (argc == 2)
    {   std::cout << "Chosen argc length: 2."<< " Copiyng 0 & 1 "<< std::endl;  
        i = CopyFile(argv[0], argv[1], false);
        std::cout << "Result: "<< i << std::endl;
        std::cout << "After OnCommand 2 " << GetCurrentProcessId() << std::endl;    }
 
    if(argc ==3)
    {   std::cout << "Chosen argc length: 3."<< " Copiyng 1 & 2 "<< std::endl;  
        i = CopyFile(argv[1], argv[2], false);
        std::cout << "Result: "<< i << std::endl;
        std::cout << "After OnCommand 2 " << GetCurrentProcessId() << std::endl;    }   
 
    else 
    {std::cout << " Argc : " << argc << std::endl;
        MessageBox(GetConsoleWindow(), L"i was not initialised " + argc, L"UAC", MB_OK);}
    
    int j = GetLastError();
    std::cout << "GetLastError: "<< j << std::endl;
 
    system("pause");
    if (i != 0) // функция возвращает не 0 если успешно завершается.
ret0 :    return 0;
    else    
        return 1;
}

Утилита должна копировать файл, при этом запуститься со всеми необходимыми правами.
Этот код выполняет копирование только родительским экземпляром. Тот который запускается с новыми правами не копирует.
При этом мне нужно чтобы в случае если запустился новый экземпляр приложения чтобы старый закрылся. Как это сделать?


Копирование каталога:

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
92
93
94
95
96
97
98
99
100
101
102
#include <string>
#include <windows.h>
#include <tchar.h>
#include <iostream>
 
int  CopyCatalog(std::wstring const & Spath, std::wstring const & Dpath)
{      
    try 
    {
        std::wstring const searchMask = Spath + L"\\*.*";    
        WIN32_FIND_DATA FindFileData; 
        HANDLE hf = FindFirstFile(searchMask.c_str(), &FindFileData);
  
        if (hf != INVALID_HANDLE_VALUE)
        { do
            {  if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если находим дирректорию 
                {   std::cout << "Directory : " << FindFileData.cFileName << " was skiped." << std::endl;}
                else
                {   std::wstring name = Spath + L"\\" + FindFileData.cFileName;
                    CopyFile(name.c_str(), Dpath.c_str(), false);   }   } 
            while (FindNextFile(hf, &FindFileData) != NULL); // ищем следующий файл 
        }
        else
        {   std::cout << "No files in folder. " << std::endl;   }       
        return 0;   }
    catch(...)
    {
        std::cout << "Coping unsuccessful." << std::endl;
        return -1;
    }
}
 
 
int DeleteDirectory( std::wstring const & refcstrRootDirectory)
{   try 
         {
             TCHAR *var = new TCHAR[refcstrRootDirectory.length() + 2];
             _tcscpy(var, refcstrRootDirectory.c_str());
             var[refcstrRootDirectory.length() + 1] = _T('\0');
 
            SHFILEOPSTRUCT shfo={0};
            shfo.wFunc=FO_DELETE;
            shfo.pFrom = var;
            shfo.fFlags=FOF_NOCONFIRMATION;
            shfo.fAnyOperationsAborted=false;
            shfo.hNameMappings=NULL;
            shfo.lpszProgressTitle=NULL;
 
            return SHFileOperation(&shfo);
     }
    catch(...)
    {
        std::cout << "Deleting unsuccessful." << std::endl;
        return -1;
    }
}
 
 
int CopyDirectory(std::wstring source, std::wstring dest )
{
    try{
        SHFILEOPSTRUCT sf={0};      
        TCHAR *s = new TCHAR[source.length() + 2];
         _tcscpy(s, source.c_str());                
         wcscat(s,L"\\*.*");
 
         s[source.length() + 1] = _T('\0');
 
         TCHAR *d = new TCHAR[dest.length() + 2];
         _tcscpy(d, dest.c_str());
         d[dest.length() + 1] = _T('\0');
        
        sf.pFrom = s;
        sf.pTo = d;
        sf.wFunc = FO_COPY;
        sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT | FOF_FILESONLY;
        return  SHFileOperation(&sf);
    }
    catch (...)
    {return 0;}
}
 
 
 /// Первый аргумент - исходный путь, второй аргумент - путь назначения,
/// Третий аргумент - флаг (перезапись (-0) / дозапись (-1)). 
 
int wmain(int argc, wchar_t *argv[])
{
    wchar_t *arr[2];
    arr[0] = L"-0";
    arr[1] = L"-1";
 
    if(wcscmp(argv[3], arr[0]) == 0)
    {  DeleteDirectory(argv[2]);
       return CopyDirectory(argv[1], argv[2]);}
    if(wcscmp(argv[3], arr[1]) == 0)
    {   return CopyDirectory(argv[1], argv[2]);   }
    else
    {   std::wcout << " Unknown parametr: " << argv[3] << std::endl;
        system("pause");
        return -1;  }
}
Этот код только создает папку, но не копирует файлы внутри.

Копирование дерева файлов и папок:
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
#include <string>
#include <windows.h>
#include <tchar.h>
#include "Source.cpp"
#include <iostream>
#include <SDKDDKVer.h>
 
int CopyDirectory(std::wstring source, std::wstring dest )
{
    try{    SHFILEOPSTRUCT sf={0};      
        TCHAR *s = new TCHAR[source.length() + 2];
         _tcscpy(s, source.c_str());                
         wcscat(s,L"\\*.*");
         s[source.length() + 1] = _T('\0');
         TCHAR *d = new TCHAR[dest.length() + 2];
         _tcscpy(d, dest.c_str());
         d[dest.length() + 1] = _T('\0');       
        sf.pFrom = s;
        sf.pTo = d;
        sf.wFunc = FO_COPY;
        sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT | FOF_FILESONLY;
        return  SHFileOperation(&sf);   }
    catch (...)
    {return 0;}}
 
int wmain(int argc, wchar_t *argv[])
{
    DWORD i = CopyDirectory(argv[1], argv[2]);  
    return i;
}
Этот код только создает папку, но не копирует файлы внутри.


Помогите фиксануть и оптимизировать/рационализировать это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2015, 16:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исправить код утилит для обновления (C++):

Исправить код - C++ Builder
Всем специалистам привет. задание - написать функцию, которая cдвигает циклически столбцы матрицы так, что первый столбец переходит на...

Исправить код, работающий со строками - C++ Builder
#include &lt;string.h&gt; void Razb_Poisk_Ed(int ,String &amp;); int Poisk_Ed=0,Poisk_Ed_Case=0,Poisk_Ud=0; String h=&quot;&quot;; void Razb(String...

Как обесцветить рисунок (исправить код) - C++ Builder
Добрый вечер! Имеется функция, которая неверно работает (мое мнение). Подскажите пожалуйста решение проблемы: необходимо цветное...

Проект, осуществляющий транспонировку матрицы, исправить код - C++ Builder
Доброго времени суток. Подскажите пожалуйста в чем проблема. Ошибку выдает только при вводе блока самой транспонировки. Как я понял вся...

Исправить код: Поменять 1 и последний столбцы StringGrid местами - C++ Builder
Надо исправить код Задача &quot;Поменять 1 и последний столбцы местами, и все элементы сместятся на 1&quot; Вот код, но тут меняются рядки. ...

Выбор сервер для обновления программы - C++ Builder
Не знал в какой раздел написать, но однозначно будет программироваться на с++builder'е. У меня есть главная программа и update.exe,...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2015, 16:00
Привет! Вот еще темы с ответами:

Исправить код. Создание класса наследник - Visual C++
Привет,Пожалуйста помогите исправить ошибку в коде! include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string.h&gt; using...

Функция GetVolumeInformation() не выводит результатов. Исправить код - C++ WinAPI
Вот код: char VolumeName ; char FileSystem ; int Serial; bool flag=GetVolumeInformation (L&quot;C:\\&quot;,(LPWSTR)VolumeName,...

Код для обновления своего .exe на новую версию - C++
Раскрываю сабж: есть программа.exe, она в автозагрузке, она работает, допустим я пишу новую версию этой программы и теперь мне нужно...

Исправить код для сортировки двумерного массива - C++
Здравствуйте! Укажите пожалуйста на мою ошибку. Нужно через быструю сортировку отсортировать двумерный массив, но что бы сортировались...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.