Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Получение имени съемного накопителя

20.12.2018, 12:01. Показов 2783. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня всем! Не знал в каком разделе написать. Знаний в области Линукса мало...
Мне необходимо написать простую программу, начал на Сишарпе. Для отлова событий изменения ядра использую udev API. Вызываю сишные методы.
Я вот не пойму, правильно - ли я выбрал направление с работой через udev? У меня с горем пополам получилось получить событие action (add/remove), но как получить имя я не знаю. Флешка у меня распознается как dev/sda, вторая как /dev/sdb
Путь в syspath = "/sys/devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0"/ Все это дело автомонтируется в /media/usb0-usb7. Ломаю голову, как же получить имя диска?
Нашел простой пример, но я так понимаю что он не даст мне имя по типу /dev/sda или /mount/usb
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
    fd_set fds;
        struct timeval tv;
        int ret;
        
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        
        ret = select(fd+1, &fds, NULL, NULL, &tv);
        
        /* Check if our file descriptor has received data. */
        if (ret > 0 && FD_ISSET(fd, &fds)) {
            printf("\nselect() says there should be data\n");
            
            /* Make the call to receive the device.
               select() ensured that this will not block. */
            dev = udev_monitor_receive_device(mon);
            if (dev) {
                printf("Got Device\n");
                printf("   Node: %s\n", udev_device_get_devnode(dev));
                printf("   Subsystem: %s\n", udev_device_get_subsystem(dev));
                printf("   Devtype: %s\n", udev_device_get_devtype(dev));
 
                printf("   Action: %s\n", udev_device_get_action(dev));
                udev_device_unref(dev);
            }
            else {
                printf("No Device from receive_device(). An error occured.\n");
            }
Для получения событий изменения я дергаю функцию udev_device_get_action(...)
В общем, запутался. Прошу помощи именно в теории, как правильно сделать и какой инструмент ОС задействовать.
ПС: Сделал так же вариант хардкода, когда имя внешнего накопителя константное, так как использую только 1 порт usb (/media/usb1), но вдруг с системой что станет и имя изменится...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2018, 12:01
Ответы с готовыми решениями:

Определение буквы съемного диска(флэшки) по имени или серийному номеру (без WMIC). Простой способ
Интересовался данной темой и что-то в гугле не нашел (мож забанили). Сегодня осенило: Поиск по имени: set...

Получение имени панели
Всем привет. У меня есть список панелей List<Panel> Panel_My = new List<Panel>(); Добавление панелей происходит Panel_My.Add(new...

Получение имени пользователя пк по ip
Есть ли возможность узнать текущее имя пользователя пк по IP, например 178.1##.5.## - Дима?...

45
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 18:10
Студворк — интернет-сервис помощи студентам
Если сама libudev, то лучше не трогать (мало ли что сломается) верните poll/select
C
1
2
3
4
5
6
7
8
    struct pollfd pfd = (struct pollfd) {
        .fd = udev_monitor_get_fd(mon),
        .events = POLLIN,
    };
    while (1) {
        if (poll(&pfd, 1, -1) < 1)
            /* если errno != EINTR то все плохо. */
        /* Далее по тексту */
Цитата Сообщение от Jman Посмотреть сообщение
Подскажите еще такой момент
Вопрос в том, что делать если флэшка вставлена раньше чем запускается ваша программа?
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 22:09  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Если сама libudev,
Комментарий взят из обертки С# над Апи udev. Так что думаю автор это сам сделал. Так как я не нашел, что бы он работал через дескрипторы и использовал poll/select и тд...
Цитата Сообщение от prik Посмотреть сообщение
Вопрос в том, что делать если флэшка вставлена раньше чем запускается ваша программа?
Программа запускается всегда при старте ОС.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
21.12.2018, 22:32
Jman, просто расскажите, чего хочется получить в итоге.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 10:13  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Jman, просто расскажите, чего хочется получить в итоге.
Мне надо вставить флешку и скопировать с нее файлы, USB порт всего один ). Хотел типо так:
- Вставил флешку, опознал что она подключена
- Прочитал ее имя
- Если подключена и есть имя, копирую файлы

Отсюда вытекает следующее, что делать, если флешка уже была подключена до запуска программы.

Можно конечно железно сделать, она всегда распознается как /dev/sda. Но мало-ли что там ОСи взбредет в голову. Возьмет и переименует. Ось обновляться не будет и она не умеет это делать автоматически, так как это buildroot.

ПС - Ошибки, что я выше запостил, идут от NONBLOCK?

Добавлено через 1 час 2 минуты
Итак, заюзав блокирову, я перестал получать постоянные ошибки, прога выводит их только один раз, но я так и не пойму, почему летит ошибка
Numerical result out of range [ERANGE].
Когда я хочу получить devnode
udev_device_get_devnode
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 11:38
Цитата Сообщение от Jman Посмотреть сообщение
Мне надо вставить флешку и скопировать с нее файлы, USB порт всего один ). Хотел типо так:
- Вставил флешку, опознал что она подключена
- Прочитал ее имя
- Если подключена и есть имя, копирую файлы
На старте через udev_enumerate_scan_devices() с соответствующими фильтрами просканировать все подходящие устройства и если нашли подходящие сделать что нужно.
Цитата Сообщение от Jman Посмотреть сообщение
Итак, заюзав блокирову, я перестал получать постоянные ошибки, прога выводит их только один раз, но я так и не пойму, почему летит ошибка
Без понятия. Код никто кроме вас не видел. Пример по вашей ссылке с адаптированным фильтром и select()/poll() работает хорошо и никаких ошибок не дает.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 11:51  [ТС]
Жаль, что мы на разных "языках разговариваем" =)
Я могу привести код.
Цитата Сообщение от prik Посмотреть сообщение
Код никто кроме вас не видел
Это обертка над Udev написанная на C# Я использую ее.
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
 var udev = new Context(); 
            var monitor = new Monitor(udev);
            var handle = udev.Handle;
            Console.WriteLine("udev Action test");
 
            monitor.Blocking = true; // Врубаю блокировку
 
            monitor.EnableReceiving(); // Врубаю сканирование
 
            while (true) {
                try {
 
                    var a = monitor.TryReceiveDevice(); // Пробую получить устройство из монитора используя // udev_monitor_receive_device(IntPtr udev_monitor); в качестве аргумента ссылка.
                    if (a.IsInitialized) { // Проверяю, есть ли интанс объекта device
 
                        //if (a.DevNode.Contains("/dev/sda") || a.DevNode.Contains("/dev/sdb"))
                        Console.WriteLine(a.DevNode); //.Substring(0, 8));
                        Console.WriteLine(a.SysName);
                        Console.WriteLine(a.Action);
                    }
                 
                }
                catch (Exception e) {
                    Console.WriteLine(e.Message);
                }
            }
Метод TryRecieveDevice
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public Device TryReceiveDevice()
        {
            var device = udev_monitor_receive_device(Handle);
            if (device == IntPtr.Zero) {
                var err = (Errno)Marshal.GetLastWin32Error();
                if (err == Errno.EWOULDBLOCK) {
                    return null;
                }
                throw new UnixIOException(err);
            }
            return new Device(device);
        }
Добавлено через 2 минуты
И вот вечный цикл меня просто бесит... Его конечно можно в отдельный поток засунуть и пусть там крутится. И как удев заметил устройство, кинуть ивент один раз.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 12:15
Jman, вряд ли я смогу вам помочь с этим, если решите переписать на С/С++ то вэлкам
Цитата Сообщение от Jman Посмотреть сообщение
monitor.Blocking = true; // Врубаю блокировку
Если вы после этого получаете EAGAIN, то оно или не работает, или где-то под капотом спрятан поллинг, т.е. кто-то где-то делает select/poll с нулевым таймаутом и возвращает этот EAGAIN. т.е до recvmsg() дело просто не доходит. Или эта строчка просто не работает и O_NONBLOCK нужно снимать как-то иначе.
На сколько я знаю, recvmsg() ERANGE сама не возвращает, разве только EMSGSIZE может. Если разберетесь с EAGAIN и ERANGE не уйдет, то можно попробовать через strace глянуть на какой ф-ции она возникает. Ну или как вариант ее возвращает библиотека/обертка.

Добавлено через 2 минуты
Цитата Сообщение от Jman Посмотреть сообщение
И вот вечный цикл меня просто бесит...
Если ваш monitor.Blocking = true; работает как надо (я думаю что нет), то код 99.99% времени спит внутри libudev
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 12:51  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
вряд ли я смогу вам помочь с этим, если решите переписать на С/С++ то вэлкам
Да вы мне и так сильно помогли! Так как я в Линукс не особо шарю, а на си кодирую только всякие АВР и СТМ32 и то для подделок.
Цитата Сообщение от prik Посмотреть сообщение
Если ваш monitor.Blocking = true; работает как надо (я думаю что нет), то код 99.99% времени спит внутри libudev
А вот это открытие для меня! Теперь я могу не заморачиваться над инструментами сканирования.

Буду ковыряться дальше, с ошибками. У меня там еще пару косяков есть, но думаю это уже мои.

Добавлено через 7 минут
Вот код блокинга -
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
public enum OpenFlags
  {
    O_RDONLY = 0,
    O_WRONLY = 1,
    O_RDWR = 2,
    O_CREAT = 64, // 0x00000040
    O_EXCL = 128, // 0x00000080
    O_NOCTTY = 256, // 0x00000100
    O_TRUNC = 512, // 0x00000200
    O_APPEND = 1024, // 0x00000400
    O_NONBLOCK = 2048, // 0x00000800
    O_SYNC = 4096, // 0x00001000
    O_NOFOLLOW = 131072, // 0x00020000
    O_DIRECTORY = 65536, // 0x00010000
    O_DIRECT = 16384, // 0x00004000
    O_ASYNC = 8192, // 0x00002000
    O_LARGEFILE = 32768, // 0x00008000
  }
 
 OpenFlags getFlags()
        {
            var ret = Syscall.fcntl(Fd, FcntlCommand.F_GETFL);
            if (ret == -1) {
                throw new UnixIOException(Marshal.GetLastWin32Error());
            }
            return (OpenFlags)ret;
        }
Вот дергаю эту функцию блокировки (что бы ООПэшники не побили, метод).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// <summary>
        /// Gets or sets the file descriptor is blocking.
        /// </summary>
        public bool Blocking {
            get {
                var flags = getFlags();
                return !flags.HasFlag(OpenFlags.O_NONBLOCK); // Hash flag проверка на тип.
            }
            set {
                var flags = getFlags();
 
                if (value) {
                    flags &= ~OpenFlags.O_NONBLOCK;
                }
                else {
                    flags |= OpenFlags.O_NONBLOCK;
                }
 
                setFlags(flags);
            }
        }
И тут как раз возвращение из Геттера (это в С# называется свойство, оно типо переменной, только абстракция выше, но по сути функция) Я всегда получаю NONBLOCK, но я взвожу его в тру. И в установке флага блокировки используется fcntl а не привычный мне ioctl, почему интересно.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 12:54
Цитата Сообщение от Jman Посмотреть сообщение
, а на си кодирую только всякие АВР и СТМ32 и то для подделок.
Так если ваша программа не должна делать что-то кроме озвученного в этой теме, переписать на с/c++ имхо лучшей выбор чем тащить в систему чужеродную среду
Цитата Сообщение от Jman Посмотреть сообщение
А вот это открытие для меня!
Поставьте вывод ".\n" в этот цикл - много точек - не спит и жрет цпу.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 13:02  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Так если ваша программа не должна делать что-то кроме озвученного в этой теме, переписать на с/c++ имхо лучшей выбор чем тащить в систему чужеродную среду
Дело в том, что у меня модуль к основной проге, которая уже написана, ее не получится переписать. Можно конечно написать на Си и запускать этот модуль С#пом, либо завернуть все в .SO и просто дергать Сишные методы. Типо scan(), и слушаем пока событие не произошло.
Цитата Сообщение от prik Посмотреть сообщение
Поставьте вывод ".\n" в этот цикл - много точек - не спит и жрет цпу.
Т.е надо убирать любой вывод кроме системного....

Добавлено через 3 минуты
Итак, EAGAIN и прочее ушло, после того как установил блокировку и стал проверять инициализацию device. Теперь сообщения приходят. Но почему-то например вставил флешку, приходит несколько сообщений подряд : add, выдернул - несколько remove. Так ведь не должно быть?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 13:18
Цитата Сообщение от Jman Посмотреть сообщение
И в установке флага блокировки используется fcntl а не привычный мне ioctl, почему интересно.
установка FIONBIO через ioctl давно считается устаревшим методом, лучше не использовать. Вообще, на сколько я знаю ioctl() изначально предназначен для работы с такой сущность как streams - линукс такого не умеет, вроде из современных *никс только в солярке реализовано.
Цитата Сообщение от Jman Посмотреть сообщение
Можно конечно написать на Си и запускать этот модуль С#пом, либо завернуть все в .SO и просто дергать Сишные методы. Типо scan(), и слушаем пока событие не произошло.
Вам видне, как лучше/удобней.
Цитата Сообщение от Jman Посмотреть сообщение
Т.е надо убирать любой вывод кроме системного....
Эм? Я имел в виду сделать простой тест - первой строчкой после try вывести точку, если точек больше чем событий, то все плохо и блокировки нет т.е. код плохой и жрет ресурсы...
Цитата Сообщение от Jman Посмотреть сообщение
Но почему-то например вставил флешку, приходит несколько сообщений подряд : add, выдернул - несколько remove. Так ведь не должно быть?
Так быть не может. Они должны чем-то отличаться. Например первое сообщения касается диска целиком, а второе раздела на этом диске. Попробуйте выводить больше информации о событии.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 14:55  [ТС]
Короче я попался... Я ж надеялся на сборщик мусора =) А тут ведь пол кода идет через неуправляемые ресурсы, которые надо ручками освобождать. Короче я тупо не делал девайсу и монитору что-то типо unref и free. =) Поэтому валило несколько сообщений... Сейчас четко отстреливает одно на событие. По поводу точку - это великолепно! Но я пошел дальше, и на виртуалке с Линуксом через Mono Develop прошелся отладчиком. И все стало ясно. В цикле крутилось постоянно, пока не вылетало сообщение о ошибке с памятью.

В общем такая штука. Когда подключаю флешку, идет событие на добавление + имя устройства. Потом когда линукс монтирует том, снова add и уже имя диска. Так должно быть?

add
/dev/bus/usb/001/030
add
/dev/sdb
ПС. А вот вообще, вы на какую IDE используете для кодинга на Си под Линукс? Я кроме Code::Blocks и не знаю другого.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 15:07
Цитата Сообщение от Jman Посмотреть сообщение
В цикле крутилось постоянно, пока не вылетало сообщение о ошибке с памятью.
Я так понимаю, что блокировки не происходит и цикл получается "жрущий"? Если да, то виновата сама libudev и нужен select/poll.
Цитата Сообщение от Jman Посмотреть сообщение
Когда подключаю флешку, идет событие на добавление + имя устройства. Потом когда линукс монтирует том, снова add и уже имя диска. Так должно быть?
Да. Вы должны видеть все события на которые подписались через udev_monitor_filter_add_match_xxx().
Цитата Сообщение от Jman Посмотреть сообщение
А вот вообще, вы на какую IDE используете для кодинга на Си под Линукс?
Никакую Обхожусь vim
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 16:03  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Я так понимаю, что блокировки не происходит и цикл получается "жрущий"? Если да, то виновата сама libudev и нужен select/poll.
Это уже решилось.
Цитата Сообщение от prik Посмотреть сообщение
Да. Вы должны видеть все события на которые подписались через udev_monitor_filter_add_match_xxx()
Я думал это баг!!! А у меня при монтировании одной флехи, он показывает все 8, которые по ходу монтируются в /media/usb0...7. Причем имя я как раз вижу конкретного устройства =)

add
/dev/bus/usb/001/053
add

add

add

add

add

add

add

add
/dev/sda

Пустая строчка - это пустой devnode.

По идее тут можно просто настроить демона udev который будет отлавливать только монтирование и дергать конкретное примонтированное устройство? Или так нельзя делать?
Цитата Сообщение от prik Посмотреть сообщение
Никакую Обхожусь vim
Это да!!! Я так собирал как-то плеер на GStreamer в nano - жесть!!! Никакого отладчикка, только хардкор. Правда я потом в Code::Bloks портировал. Там хоть удобно и подсветка синтаксиса и пошагать можно.

Добавлено через 1 минуту
Как в этот фильтр добавить только экшн на монтирование и устройство?
C
1
udev_monitor_filter_add_match()
Добавлено через 37 минут
И кстати, почему то в папке /etc/udev/rules.d Пусто. Но есть там и другая - /etc/udev/hwdb.d - и там все устройства (клавы, мышки и тд...) Хз, как понимать. Получается там уже все настроено?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 16:21
Цитата Сообщение от Jman Посмотреть сообщение
Как в этот фильтр добавить только экшн на монтирование и устройство?
Фильтр добавляется на устройства, а не на события. Причем на группу (subsystem) устройств. Нужно через udevadm посмотреть к каким подсистемам принадлежит нужное вам и фильтровать их. Остальное отсеивать руками после успешного вызова udev_monitor_receive_device().
Цитата Сообщение от Jman Посмотреть сообщение
И кстати, почему то в папке /etc/udev/rules.d
Она для ваших персональных настроек. Системные где-нибудь в районе /lib/udev или /usr/lib/udev
Цитата Сообщение от Jman Посмотреть сообщение
А у меня при монтировании одной флехи, он показывает все 8
На флэшке куча разделов? Или это какой-то кардридер?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 16:25  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
На флэшке куча разделов? Или это какой-то кардридер?
Один раздел FAT32. Но если в папку медиа глянуть - там
# cd media
# ls
usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
Без присутствия моей флешки.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 16:33
Попробуйте выводить больше информации о событиях, что бы понять какие это устройства с пустым devnode
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 16:37  [ТС]
udev Action test
remove

scsi_device
No such file or directory [ENOENT].
add
/dev/bus/usb/001/060
usb
usb_device
add

usb
usb_interface
add

scsi
scsi_target
add

scsi
scsi_device
add

scsi_disk
No such file or directory [ENOENT].
add

scsi_device
No such file or directory [ENOENT].
add

bdi
No such file or directory [ENOENT].
add
/dev/sda
block
disk
Попробовал печатать action, devnode, subsystem devtype.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
22.12.2018, 16:42
А как сейчас фильтр выглядит?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 19:34  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
А как сейчас фильтр выглядит?
Я может не верно понял, но я пока не добавлял фильрацию... Хз как это сделать, вернее что в качестве тэга туда пулять, не systemd или как там правильно. Я пока отложу до понедельника, хватит с меня )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2018, 19:34
Помогаю со студенческими работами здесь

Получение имени каталога
Добрый день. При работе с файлами, возникает потребность превратить C:\Windows\Temp в просто Temp. Есть ли какой-либо встроенный метод...

Получение имени файла
У меня есть код для просмотра изображение при нажатии button, но не могу сделать так чтобы имя файла вместе с картинкой присваивалось label?

Получение имени окна
Админы тут баг в форуме я как то стер всю сваю тему!...

Получение имени файла
Подскажите как получить имя файла находящегося скажим в папке My music cредствами C#??

получение имени по ip из dyndns
У меня динамический реальный айпи и пользуюсь сервисом dyndns.com. Hostname, который я там привязал к своему айпи? пингуется из вне и к...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru