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

C++

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

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

04.08.2015, 16:00. Просмотров 363. Ответов 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;
}
Этот код только создает папку, но не копирует файлы внутри.


Помогите фиксануть и оптимизировать/рационализировать это.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2015, 16:00     Исправить код утилит для обновления
Посмотрите здесь:

Исправить код C++ Builder
C++ Исправить код
C++ Исправить код для ввода и вывода матрицы
исправить код C++
C++ Код для обновления своего .exe на новую версию
C++ исправить код
C++ Исправить код для сортировки двумерного массива
C++ Исправить код
C++ Исправить код
Как сплести набор взаимосвязанных утилит ? C++
Исправить код C++
Исправить код метод Ньютона для решения систем нелинейных уравнений под нужное условие C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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