Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12

Написание службы и создание инсталлятора для неё

24.01.2014, 22:22. Показов 2642. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не мало чего перечитал, но мало чего понял. скиньте пожалуйста инфу по:
1 написание минимальной службы
2 создание инсталлятора для неё(служба должна стоять на авто запуске)
ПС требуется так установить службу чтобы она могла на windows 8 сама себя удалить, т е нужно запустить её с высокими правами. Инсталлятор будет запускаться от имени администратора
за ранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2014, 22:22
Ответы с готовыми решениями:

Создание инсталлятора для проекта Qt
Добрый день всем. Возникла необходимость сделать инсталлятор для программы, созданной с помощью Qt. Ранее этим не занимался,...

Создание инсталлятора для макроса
Такая проблемма!!! Написал макрос для Ворда,храниться в файле шаблона, терь хочу сделать инсталятор, дабы он создавал кнопочку на панели...

Создание инсталлятора для Web-приложения
Я разрабатываю Web-приложение, которое распространяется через Internet, из-за чего пользователям придется САМИМ устанавливать его на свой...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.01.2014, 22:34
Лучший ответ Сообщение было отмечено Van111 как решение

Решение

Цитата Сообщение от Van111 Посмотреть сообщение
скиньте пожалуйста инфу по:
1 написание минимальной службы
"Программирование серверных приложений для Windows 2000" (Д. Рихтер, Д. Кларк).
"Системное программирование в среде Windows" (Д. Харт).
"Системное программирование в Windows" (А. Побегайло).

Simple Windows Service in C++
http://www.codeproject.com/Art... -Cplusplus

A basic Windows service in C++
http://code.msdn.microsoft.com... e-cacf4948

Цитата Сообщение от Van111 Посмотреть сообщение
2 создание инсталлятора для неё(служба должна стоять на авто запуске)
CreateService
http://msdn.microsoft.com/en-u... 85%29.aspx

Цитата Сообщение от Van111 Посмотреть сообщение
ПС требуется так установить службу чтобы она могла на windows 8 сама себя удалить, т е нужно запустить её с высокими правами.
По умолчанию, если не задано иное, служба устанавливается на запуск от
системной учетной записи с полными правами в системе, так что с этим проблем не будет.

Добавлено через 2 минуты
Вдогонку:

Управление системными службами Windows NT (Часть 1)
http://www.rsdn.ru/article/baseserv/svcadmin-1.xml

Управление системными службами Windows NT (Часть 2)
http://www.rsdn.ru/article/baseserv/svcadmin-2.xml
2
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
01.02.2014, 15:00  [ТС]
Убежденный, подскажите пожалуйста , с какими параметрами нужно запускать службу чтобы, она сразу запустилась, была добавлена в авто запуск и ИМЕЛА возможность работы с файлами, а так же возможность запуска файлов?

Добавлено через 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
#pragma region Includes
#include <stdio.h>
#include <windows.h>
#include "ServiceInstaller.h"
#include "ServiceBase.h"
#include "SampleService.h"
#pragma endregion
 
 
// 
// Settings of the service
// 
 
// Internal name of the service
#define SERVICE_NAME             L"CppWindowsService"
 
// Displayed name of the service
#define SERVICE_DISPLAY_NAME     L"CppWindowsService Sample Service"
 
// Service start options.
#define SERVICE_START_TYPE       SERVICE_DEMAND_START
 
// List of service dependencies - "dep1\0dep2\0\0"
#define SERVICE_DEPENDENCIES     L""
 
// The name of the account under which the service should run
#define SERVICE_ACCOUNT          L"NT AUTHORITY\\LocalService"
 
// The password to the service account name
#define SERVICE_PASSWORD         NULL
 
 
//
//  FUNCTION: wmain(int, wchar_t *[])
//
//  PURPOSE: entrypoint for the application.
// 
//  PARAMETERS:
//    argc - number of command line arguments
//    argv - array of command line arguments
//
//  RETURN VALUE:
//    none
//
//  COMMENTS:
//    wmain() either performs the command line task, or run the service.
//
int wmain(int argc, wchar_t *argv[])
{
    if ((argc > 1) && ((*argv[1] == L'-' || (*argv[1] == L'/'))))
    {
        if (_wcsicmp(L"install", argv[1] + 1) == 0)
        {
            // Install the service when the command is 
            // "-install" or "/install".
            InstallService(
                SERVICE_NAME,               // Name of service
                SERVICE_DISPLAY_NAME,       // Name to display
                SERVICE_START_TYPE,         // Service start type
                SERVICE_DEPENDENCIES,       // Dependencies
                SERVICE_ACCOUNT,            // Service running account
                SERVICE_PASSWORD            // Password of the account
                );
        }
        else if (_wcsicmp(L"remove", argv[1] + 1) == 0)
        {
            // Uninstall the service when the command is 
            // "-remove" or "/remove".
            UninstallService(SERVICE_NAME);
        }
    }
    else
    {
        wprintf(L"Parameters:\n");
        wprintf(L" -install  to install the service.\n");
        wprintf(L" -remove   to remove the service.\n");
 
        CSampleService service(SERVICE_NAME);
        if (!CServiceBase::Run(service))
        {
            wprintf(L"Service failed to run w/err 0x%08lx\n", GetLastError());
        }
    }
 
    return 0;
}
что нужно поставить в define констанкты
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.02.2014, 15:09
Цитата Сообщение от Van111 Посмотреть сообщение
с какими параметрами нужно запускать службу чтобы, она сразу запустилась
Служба запускается через функцию StartService:
http://msdn.microsoft.com/en-u... 85%29.aspx

Цитата Сообщение от Van111 Посмотреть сообщение
была добавлена в авто запуск
Служба стартует автоматически, если тип запуска - SERVICE_AUTO_START.
SERVICE_DEMAND_START - это запуск вручную, то есть, через StartService.

Цитата Сообщение от Van111 Посмотреть сообщение
и ИМЕЛА возможность работы с файлами, а так же возможность запуска файлов?
А какие с этим проблемы ?

Цитата Сообщение от Van111 Посмотреть сообщение
что нужно поставить в define констанкты
Да все правильно у Вас прописано.
Только в SERVICE_START_TYPE что-то непонятное - SERVICE_DEMAND_START SERVICE_

В SERVICE_DEPENDENCIES можете передавать NULL, если нет зависимостей.

На счет SERVICE_ACCOUNT решать Вам.
LocalService и NetworkService - это очень ограниченные сервисные учетки.
Если передать NULL, служба будет запускаться от LocalSystem - это
максимальные права.
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
02.02.2014, 11:04  [ТС]
Убежденный, вроде всё работает но почему то не удаётся поработать с реестром через службу.
то, что код рабочий - проверял через консольный проект. как быть?
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
    reg_data.open(name_file_reg_data2, ios::in);
            while(!reg_data.eof())
                {
                getline(reg_data,s_tmp);
                decoder(s_tmp); // расшифровали данные
                vec_s.push_back(s_tmp);
            }
    
            reg_data.close();
    
 
        reg_data.open(name_file_reg_data, ios::out);
        win_reg::Registry r_test;
        for(auto &i :vec_s)
        {
            reg_data << i;// проверка раскодировки строк
            string tmp_s1 = i.substr(0,i.find('\\'));
            string tmp_s2 = i.substr(i.find('\\') + 1,i.rfind('\\') - i.find('\\') - 1 );
            string tmp_s3 = i.substr(i.rfind('\\') +1,i.size() - i.rfind(' ') + 1);
            string tmp_s4 = i.substr(i.rfind(' ') + 1,i.size() - i.rfind(' '));
            HKEY hkey;
            if(tmp_s1 =="HKEY_CLASSES_ROOT")
                  hkey = HKEY_CLASSES_ROOT;
            if(tmp_s1 =="HKEY_CURRENT_USER")
                  hkey = HKEY_CURRENT_USER;
            if(tmp_s1 =="HKEY_LOCAL_MACHINE")
                  hkey = HKEY_LOCAL_MACHINE;
            if(tmp_s1 =="HKEY_USERS")
                  hkey = HKEY_USERS;
            if(tmp_s1 =="HKEY_CURRENT_CONFIG")
                  hkey = HKEY_CURRENT_CONFIG;
        
            WCHAR* tmp_w2 = new TCHAR[tmp_s2.size() + 1];
            WCHAR* tmp_w3 = new TCHAR[tmp_s3.size() + 1];
            WCHAR* tmp_w4 = new TCHAR[tmp_s4.size() + 1];
 
            AnsiToUnicode16((char*)tmp_s2.c_str(),tmp_w2,tmp_s2.size() + 1);
            AnsiToUnicode16((char*)tmp_s3.c_str(),tmp_w3,tmp_s3.size() + 1);
            AnsiToUnicode16((char*)tmp_s4.c_str(),tmp_w4,tmp_s4.size() + 1);
                r_test.OpenKey(&hkey,tmp_w2, false);
                r_test.SetValueString(tmp_w3,tmp_w4);
                r_test.CloseKey(hkey);
        }
Добавлено через 19 минут
вот весь код
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
164
165
166
167
168
169
#include <string>
#include <map>
#include <fstream>
#include <vector>
#include <Windows.h>
#include "test\win_reg.h"
#include <tchar.h>
#include <string.h>
#include <time.h>
 
using namespace std;
const int ofset_char = 32;
const char name_file_reg_data[] = "_my_data_reg";
const char name_file_reg_data2[] = "_my_data_reg2";
const char name_file_time[] = "_my_time_reg2";
 
const int max_lenght_string = 1024;
void coder(string &s)
{
    for(auto &i : s)
        i += ofset_char;
}
void decoder(string &s)
{
    for(auto &i : s)
        i -= ofset_char;
}
void coder_file()
{
    string s_tmp;
    vector <string> vec_s;
    fstream reg_data;
    reg_data.open(name_file_reg_data, ios::in);
    if(reg_data.good())
    {
        while(!reg_data.eof())
        {
            getline(reg_data,s_tmp);
            coder(s_tmp);
            vec_s.push_back(s_tmp);
        }
        reg_data.close();
        remove(name_file_reg_data);
        reg_data.open(name_file_reg_data2, ios::out);
        for(vector <string>::iterator i = vec_s.begin(); i < vec_s.end(); i++)
            {
                reg_data << *i;
                if(i != vec_s.end() - 1)
                    reg_data <<endl;
            }
        reg_data.close();
    }
 
}
BOOL AnsiToUnicode16(CHAR *in_Src, WCHAR *out_Dst, INT in_MaxLen)
{
    /* locals */
    INT lv_Len;
 
  // do NOT decrease maxlen for the eos
  if (in_MaxLen <= 0)
    return FALSE;
 
  // let windows find out the meaning of ansi
  // - the SrcLen=-1 triggers MBTWC to add a eos to Dst and fails if MaxLen is too small.
  // - if SrcLen is specified then no eos is added
  // - if (SrcLen+1) is specified then the eos IS added
  lv_Len = MultiByteToWideChar(CP_ACP, 0, in_Src, -1, out_Dst, in_MaxLen);
 
  // validate
  if (lv_Len < 0)
    lv_Len = 0;
 
  // ensure eos, watch out for a full buffersize
  // - if the buffer is full without an eos then clear the output like MBTWC does
  //   in case of too small outputbuffer
  // - unfortunately there is no way to let MBTWC return shortened strings,
  //   if the outputbuffer is too small then it fails completely
  if (lv_Len < in_MaxLen)
    out_Dst[lv_Len] = 0;
  else if (out_Dst[in_MaxLen-1])
    out_Dst[0] = 0;
 
  // done
  return TRUE;
}
 
int main()
{
    fstream reg_data;
    string s_tmp;
    vector <string> vec_s;
 
     tm beg_time;
     __time64_t long_time;
     _time64( &long_time ); 
    _localtime64_s( &beg_time, &long_time ); 
 
 
    reg_data.open(name_file_time, ios::in || ios::out);
    if(reg_data.good())
    {
        reg_data >>beg_time.tm_yday;
    }
    else
    {
        reg_data.close();
        reg_data.open(name_file_time, ios::out);
        reg_data << beg_time.tm_yday;
        reg_data.close();
        coder_file();
        return 0;
    }
    reg_data.close();
 
    tm new_time;
     _time64( &long_time ); 
    _localtime64_s( &new_time, &long_time ); 
 
    coder_file();
    if(new_time.tm_yday == beg_time.tm_yday)
    {
        
        reg_data.open(name_file_reg_data2, ios::in);
            while(!reg_data.eof())
                {
                getline(reg_data,s_tmp);
                decoder(s_tmp);
                vec_s.push_back(s_tmp);
            }
    
            reg_data.close();
    
 
        
        win_reg::Registry r_test;
        for(auto &i :vec_s)
        {
            string tmp_s1 = i.substr(0,i.find('\\'));
            string tmp_s2 = i.substr(i.find('\\') + 1,i.rfind('\\') - i.find('\\') - 1 );
            string tmp_s3 = i.substr(i.rfind('\\') +1,i.size() - i.rfind(' ') + 1);
            string tmp_s4 = i.substr(i.rfind(' ') + 1,i.size() - i.rfind(' '));
            HKEY hkey;
            if(tmp_s1 =="HKEY_CLASSES_ROOT")
                  hkey = HKEY_CLASSES_ROOT;
            if(tmp_s1 =="HKEY_CURRENT_USER")
                  hkey = HKEY_CURRENT_USER;
            if(tmp_s1 =="HKEY_LOCAL_MACHINE")
                  hkey = HKEY_LOCAL_MACHINE;
            if(tmp_s1 =="HKEY_USERS")
                  hkey = HKEY_USERS;
            if(tmp_s1 =="HKEY_CURRENT_CONFIG")
                  hkey = HKEY_CURRENT_CONFIG;
        
            WCHAR* tmp_w2 = new TCHAR[tmp_s2.size() + 1];
            WCHAR* tmp_w3 = new TCHAR[tmp_s3.size() + 1];
            WCHAR* tmp_w4 = new TCHAR[tmp_s4.size() + 1];
 
            AnsiToUnicode16((char*)tmp_s2.c_str(),tmp_w2,tmp_s2.size() + 1);
            AnsiToUnicode16((char*)tmp_s3.c_str(),tmp_w3,tmp_s3.size() + 1);
            AnsiToUnicode16((char*)tmp_s4.c_str(),tmp_w4,tmp_s4.size() + 1);
                r_test.OpenKey(&hkey,tmp_w2, false);
                r_test.SetValueString(tmp_w3,tmp_w4);
                r_test.CloseKey(hkey);
        }
 
 
    }
}
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
 /*(c)Dr.Miller Web: [url]http://drmiller-developer.blogspot.com/*/[/url]
 
#ifndef W_REGISTRY_H_INCLUDED
#define W_REGISTRY_H_INCLUDED
#include <iostream>
#include <string.h>
#include <windows.h>
#include <tchar.h>
 
namespace win_reg {
 
class Registry {
private:
    bool pr_is_error;
    HKEY pr_hkey;
    DWORD pr_reserved;
    REGSAM pr_desired;
    DWORD pr_options;
    DWORD pr_type;
    DWORD pr_buffer_size;
    std::string pr_buffer_str;
    void SysGetValue(LPCTSTR a_parname, BYTE* a_buffer, DWORD* a_buf_size);
    void SysSetValue(LPCTSTR a_parname, DWORD a_type, const BYTE* a_value, DWORD a_value_size);
 
public:
    Registry();
    ~Registry();
    void OpenKey(HKEY* a_hkey, LPCTSTR a_subkey, bool a_can_create);
 
    void SetValueString(LPCTSTR a_parname, const TCHAR* a_value);
    void SetValueExpandString(LPCTSTR a_parname, const TCHAR* a_value);
    void SetValueInt(LPCTSTR a_parname, const long* a_value);
    void SetValueFloat(LPCTSTR a_parname, const double* a_value);
 
    std::string GetValueString(LPCTSTR a_parname);
    std::string GetValueExpandString(LPCTSTR a_parname);
    long GetValueInt(LPCTSTR a_parname);
    double GetValueFloat(LPCTSTR a_parname);
 
    void CloseKey(HKEY a_hkey);
    void CloseKey();
};
 
}
 
 
#endif // W_REGISTRY_H_INCLUDED
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
164
165
166
167
168
169
170
 #include "win_reg.h"
 
void win_reg::Registry::SysGetValue(LPCTSTR a_parname, BYTE* a_buffer, DWORD* a_buf_size)
{
    if (!pr_is_error)
    {
        if (RegQueryValueEx(
                pr_hkey,
                a_parname,
                NULL,
                &pr_type,
                NULL,
                &pr_buffer_size) == ERROR_SUCCESS)
            RegQueryValueEx(pr_hkey, a_parname, NULL, &pr_type, (LPBYTE)a_buffer, a_buf_size);
    }
}
 
void win_reg::Registry::SysSetValue(LPCTSTR a_parname, DWORD a_type, const BYTE* a_value, DWORD a_value_size)
{
    if (!pr_is_error)
        pr_is_error = (RegSetValueEx(
            pr_hkey,
            a_parname,
            NULL,
            a_type,
            (BYTE*)a_value,
            a_value_size) != ERROR_SUCCESS);
 
}
 
win_reg::Registry::Registry()
{
    pr_is_error = false;
    pr_reserved = 0;
    pr_desired = KEY_ALL_ACCESS;
    pr_options = REG_OPTION_NON_VOLATILE;
    pr_type = 0;
    pr_buffer_size = 0;
    pr_buffer_str = "";
}
 
win_reg::Registry::~Registry()
{
 
}
 
void win_reg::Registry::OpenKey(HKEY* a_hkey, LPCTSTR a_subkey, bool a_can_create)
{
    pr_hkey = *a_hkey;
    if (a_can_create)
    {
        pr_is_error = (RegCreateKeyEx(
            pr_hkey,
            a_subkey,
            pr_reserved,
            NULL,
            pr_options,
            pr_desired,
            NULL, &pr_hkey,
            NULL) != ERROR_SUCCESS);
    }
    else
    {
        pr_is_error = (RegOpenKeyEx(
            pr_hkey,
            a_subkey,
            pr_reserved,
            pr_desired,
            &pr_hkey));
    }
}
 
void win_reg::Registry::SetValueString(LPCTSTR a_parname, const TCHAR* a_value)
{
    if (!pr_is_error)
        pr_is_error = (RegSetValueEx(
            pr_hkey,
            a_parname,
            NULL,
            REG_SZ,
            (BYTE*)a_value,
            sizeof(TCHAR)*_tcslen(a_value)) != ERROR_SUCCESS);
}
 
void win_reg::Registry::SetValueExpandString(LPCTSTR a_parname, const TCHAR* a_value)
{
    SysSetValue(a_parname, REG_EXPAND_SZ, (BYTE*)a_value, sizeof(TCHAR)*_tcslen(a_value));
}
 
void win_reg::Registry::SetValueInt(LPCTSTR a_parname, const long* a_value)
{
    SysSetValue(a_parname, REG_DWORD, (BYTE*)a_value, sizeof(long));
}
 
void win_reg::Registry::SetValueFloat(LPCTSTR a_parname, const double* a_value)
{
    SysSetValue(a_parname, REG_BINARY, (BYTE*)a_value, sizeof(double));
}
 
std::string win_reg::Registry::GetValueString(LPCTSTR a_parname)
{
    if (!pr_is_error)
    {
        pr_buffer_str = "";
        if (RegQueryValueEx(
                pr_hkey,
                a_parname,
                NULL,
                &pr_type,
                NULL,
                &pr_buffer_size) == ERROR_SUCCESS)
            if (pr_type == REG_SZ)
            {
                char* buffer = new char[pr_buffer_size];
                RegQueryValueEx(pr_hkey, a_parname, NULL, &pr_type, (LPBYTE)buffer, &pr_buffer_size);
                pr_buffer_str = buffer;
                delete[] buffer;
            }
    }
    return pr_buffer_str;
}
 
std::string win_reg::Registry::GetValueExpandString(LPCTSTR a_parname)
{
    if (!pr_is_error)
    {
        pr_buffer_str = "";
        if (RegQueryValueEx(
                pr_hkey,
                a_parname,
                NULL,
                &pr_type,
                NULL,
                &pr_buffer_size) == ERROR_SUCCESS)
            if (pr_type == REG_EXPAND_SZ)
            {
                char* buffer = new char[pr_buffer_size];
                RegQueryValueEx(pr_hkey, a_parname, NULL, &pr_type, (LPBYTE)buffer, &pr_buffer_size);
                pr_buffer_str = buffer;
                delete[] buffer;
            }
    }
 
    return pr_buffer_str;
}
 
long win_reg::Registry::GetValueInt(LPCTSTR a_parname)
{
    long buffer = 0;
    SysGetValue(a_parname, (LPBYTE)&buffer, &pr_buffer_size);
    return buffer;
}
 
double win_reg::Registry::GetValueFloat(LPCTSTR a_parname)
{
    double buffer = 0;
    SysGetValue(a_parname, (LPBYTE)&buffer, &pr_buffer_size);
    return buffer;
}
 
void win_reg::Registry::CloseKey(HKEY a_hkey)
{
    if (!pr_is_error)
        pr_is_error = (RegCloseKey(a_hkey) != ERROR_SUCCESS);
}
 
void win_reg::Registry::CloseKey()
{
    CloseKey(pr_hkey);
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.02.2014, 11:51
Лучший ответ Сообщение было отмечено Van111 как решение

Решение

Цитата Сообщение от Van111 Посмотреть сообщение
вроде всё работает но почему то не удаётся поработать с реестром через службу.
Сейчас и на будущее: "не удается", "вроде" - это очень размытое
описание проблемы.

Что именно не удается ?
Какие коды возвращают функции ?
Что в GetLastError ?

C++
1
2
if(tmp_s1 =="HKEY_CURRENT_USER")
    hkey = HKEY_CURRENT_USER;
Надеюсь, Вы понимаете, что читать эту ветку реестра из службы бессмысленно ?
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
02.02.2014, 12:56  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Надеюсь, Вы понимаете, что читать эту ветку реестра из службы бессмысленно ?
к сожалению не знал, теперь понятно, в файле где были указаны ключи для изменения , везде присутствовала эта ветка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2014, 12:56
Помогаю со студенческими работами здесь

Создание инсталлятора для программы на Билдере
Для оформления курсовой надо создать инсталлятор. Подскажите, пожалуйста, чем его создавать? Может, у кого мануал есть? Заранее...

Написание службы для создания скриншотов
Всем привет! Есть код который делает снимок экрана. Пытаюсь переделать его в службу. Просьба помочь. using System; using...

создание инсталлятора
я написал программу в Visual Basic 2008 Express Edition. и теперь нужно сделать инсталляционный пакет. Насколько я понимаю в Express...

Создание инсталлятора
Подскажите хорошую програму для создания инсталятора. Платную/безплатную не суть важно. -Желательно пару вариантов.

Создание Инсталлятора
Хочу создать exe-шник, впихну туда свои файлы, но есть одно Но, нужен такой, чтоб установить скомпилированый файл в тут папку, где будет...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru