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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Есть исходники браузера, на С++, где найти информацию или как определить какой файл, за что отвечает? http://www.cyberforum.ru/cpp/thread1506349.html
доброго времени, форумчане. Есть исходники браузера, на С+. Файлов немерено. Где найти информацию или как определить какой файл, за что отвечает? например за выполнении функции Math.floor?
C++ Голосовое управление операционной системой Такой вопрос: можно ли сделать голосовое управление? например, грубо говоря, произносишь слово "время" и на экране показывается время. т.е. слово сказал - получил действие. http://www.cyberforum.ru/cpp/thread1506199.html
Использование драйвера ftd2xx для програмирования микросхем C++
Имеется мост FTDI um245R. Скачал Progrаmming guide для данного типа девайса, но пока не могу понят как происходит их программирование при помощи драйвера d2xx. Скачал файлы ftdi2xx.h и ftdi2xx.dll,...
C++ Программа ПРОВОДНИК для Windows 7
Здравствуйте! У меня руки чешутся, заражЁн революционными преобразованиями — а знаний нет! Помогите, пожалуйста, НОВАТОРУ. Кто чем может… Прошу прощения, на каком языке написана программа ниже...
C++ Проверка пароля: чекер ключей http://www.cyberforum.ru/cpp/thread1504852.html
У кого есть время написать небольшой чекер ключей? Суть: Вбиваем список ключей в программу, она идёт на https://aw.mail.ru/pin/вбивает в окошко по очереди ключи и нажимает активировать. Если...
C++ Где взять движок Chromium (Google Chrome, Opera)? Где достать движок Chromium (google chrome , opera)??? Хочу отредактировать до лично себя, так как оригинальные хром или опера кое где не особо подходят... Я находил как-то ссылку на двиг, и... подробнее

Показать сообщение отдельно
VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015

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

04.08.2015, 16:00. Просмотров 387. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru