Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2021, 15:36   #1
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 45
По умолчанию Запись в структуре

Приветствую уважаемые.
Объясните пжл. следующие записи (выделено в коде):
{} - в примерах используется нулевой указатель NULL. Всегда ли {}=NULL или есть какие то различия, ограничения и т.п.
:: -два двоеточия
и
s_SC_HANDLE_wrapper()=default;
То, что это функция понятно, а почему по-умолчанию? и что подразумевается под default
Код:
struct s_SC_HANDLE_wrapper //объявление структуры
{
	SC_HANDLE handle{};

	s_SC_HANDLE_wrapper()=default;
	s_SC_HANDLE_wrapper(const s_SC_HANDLE_wrapper&)=delete;
	s_SC_HANDLE_wrapper(s_SC_HANDLE_wrapper&&)=delete;
	s_SC_HANDLE_wrapper& operator=(const s_SC_HANDLE_wrapper&)=delete;
	s_SC_HANDLE_wrapper& operator=(s_SC_HANDLE_wrapper&&)=delete;

	//подключение к базе служб
	bool OpenSCManager()
	{
		Close();
		handle=::OpenSCManager(
			{},//локальная машина
			{},//активная база данных сервисов
			SC_MANAGER_CONNECT//соединение с менеджером
		);

		if(!handle)
		{
			printf("Ошибка подключения к менеджеру служб(%ld)\n Код ошибки: ", GetLastError());
			return false;
		}

		printf("Менеджер служб подключен.\n");
		return true;
	}
druidvic вне форума Ответить с цитированием
Старый 01.01.2022, 09:11   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

druidvic,
default - предписывает компилятору реализовать функцию по умолчанию (можно использовать с конструкторами (по умолчанию/копирования /перемещения/), с оператором копирования/перемещения, деструктором)
delete - явно удаляет (запрещает) реализацию вышеперечисленных функций

:: - в данном случае указывается, что идентификатор нужно взять из глобального неймспейса

{} - пустой список инициализации. Для встроенных типов означает их инициализацию нулевым значением
Алексей1153 вне форума Ответить с цитированием
Старый 01.01.2022, 17:26   #3
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 45
По умолчанию

Алексей1153
Спасибо.
Но что делает GCC когда встречает
Код:
s_SC_HANDLE_wrapper()=default;
непонятно.

Последний раз редактировалось druidvic; 01.01.2022 в 19:45.
druidvic вне форума Ответить с цитированием
Старый 02.01.2022, 09:30   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
Но что делает GCC когда встречает
реализует данный метод по умолчанию
Алексей1153 вне форума Ответить с цитированием
Старый 02.01.2022, 11:47   #5
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
реализует данный метод по умолчанию
Какой?!
Непонятно значение default в данном контексте. То что указанная функция выполняется если не указана другая - понятно. Но применительно к какому объекту? Других то выборов нет.
В ОС с браузером=default или с расширением файла понятно. А тут? Просто утилитка, все по шагам.

Шаг влево, шаг вправо - расстрел. Подпрыгнул - попытка побега

Код:
#include <windows.h>
#include <winsvc.h>
#include <stdio.h>
#include <locale>

struct s_SC_HANDLE_wrapper //объявление структуры
{
	SC_HANDLE handle{}; //объявление переменной handle типом указатель с пустым значением (NULL)

	s_SC_HANDLE_wrapper()=default;
	s_SC_HANDLE_wrapper(const s_SC_HANDLE_wrapper&)=delete;
	s_SC_HANDLE_wrapper(s_SC_HANDLE_wrapper&&)=delete;
	s_SC_HANDLE_wrapper& operator=(const s_SC_HANDLE_wrapper&)=delete;
	s_SC_HANDLE_wrapper& operator=(s_SC_HANDLE_wrapper&&)=delete;
	LPTSTR errorText = NULL;

	//подключение к базе служб
	bool OpenSCManager()
	{
		Close();
		handle=::OpenSCManager(
			{},//локальная машина
			{},//активная база данных сервисов
			SC_MANAGER_CONNECT//соединение с менеджером
		);

		if(!handle)
		{
			printf("Ошибка подключения к менеджеру служб(%ld)\n Код ошибки: ", GetLastError());
			return false;
		}

		printf("Менеджер служб подключен.\n");
		return true;
	}

	//подключение к службе
	bool OpenService(const s_SC_HANDLE_wrapper& schSCManager,LPCSTR lpServiceName)
	{
		Close();
		if(!lpServiceName)return false;
		if(!schSCManager)return false;
		handle=::OpenService
		(
			schSCManager.handle,
			lpServiceName,
			GENERIC_ALL //полный доступ
		);

		//проверка подключения
		if(!handle)
		{
			printf("Ошибка в службе (%ld)\n", GetLastError());
        FormatMessage(
   // Использовать таблицу системных сообщений для получения текста ошибки
   FORMAT_MESSAGE_FROM_SYSTEM
   // выделить буфер на локальной куче для текста ошибки
   |FORMAT_MESSAGE_ALLOCATE_BUFFER
   // Important! will fail otherwise, since we're not
   // (and CANNOT) pass insertion parameters
   |FORMAT_MESSAGE_IGNORE_INSERTS,
   NULL,    // неиспользуется с FORMAT_MESSAGE_FROM_SYSTEM
   GetLastError(),//получить код ошибки
   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
   (LPTSTR)&errorText,  // вывод
   0, //Минимальный размер для выходного буфера
   NULL);   // аргументы - без аргументов

if ( NULL != errorText )
{
   // ... делаем что-нибудь со строкой `errorText` - log it, отображаем и т.д.
   //setlocale(LC_CTYPE, ""); уже не надо, т.к. сделал внешней
    printf (errorText);
   // освобождаем память выделенную под FormatMessage()
   LocalFree(errorText);
   errorText = NULL;
}
			return false;
		}
		printf ("Подключена %s\n", lpServiceName);

		return true;
	}

	void Close()
	{
		if(handle)
		{
			::CloseServiceHandle(handle);
		}
		handle={};
	}

	constexpr operator bool()const noexcept
	{
		return !!handle;
	}

	~s_SC_HANDLE_wrapper()
	{
		Close();
	}
};

int main()
{
	setlocale(LC_CTYPE, "");//локаль по умолчанию

	//подключение к базе служб
s_SC_HANDLE_wrapper schSCManager;
if (!schSCManager.OpenSCManager())return 0;

//подключение к службе
s_SC_HANDLE_wrapper schService1;
if (!schService1.OpenService(schSCManager, "SharedAccess"))return 0; //Общий доступ к подключению к Интернету (ICS)

//подключение к службе
s_SC_HANDLE_wrapper schService2;
if (!schService2.OpenService(schSCManager, "RemoteRegistry"))return 0; //Удаленный реестр

//подключение к службе
s_SC_HANDLE_wrapper schService3;
if (!schService3.OpenService(schSCManager, "SCardSvr"))return 0; //Смарт-карта

	return 0;
}
P.S. Дописываю потихоньку.
P.S.S. Пытаюсь.
druidvic вне форума Ответить с цитированием
Старый 03.01.2022, 07:18   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от druidvic Посмотреть сообщение
Какой
почитай уже теорию, что ли
https://en.cppreference.com/w/cpp/la...lt_constructor
https://www.bestprog.net/ru/2019/08/...s-of-using-ru/
Алексей1153 вне форума Ответить с цитированием
Старый 04.01.2022, 13:57   #7
druidvic
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 45
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Спасибо за конкретные ссылки! То что надо.
P.S. Времени на все, к сожалению, не хватает.
druidvic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы - Спроектировать и разработать классы Запись в блокноте и Блокнот. Реализовать методы: Добавить запись, Удалить запись, Редактировать запись SashaRozhkov Помощь студентам 0 05.08.2017 19:16
Запись "0" в поле int в Структуре (Си) Kruudash Помощь студентам 1 24.05.2013 00:24
Сортировка в структуре. Sorento2 Общие вопросы C/C++ 8 19.12.2012 01:05
редактирование в структуре MorbiuS Общие вопросы C/C++ 7 21.12.2010 03:05
Замечания к структуре БД artemavd БД в Delphi 0 30.04.2009 13:01