powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот это номер! CreatEvent - не работает!
25 сообщений из 52, страница 1 из 3
Вот это номер! CreatEvent - не работает!
    #38895708
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая известная всем функция Win32 API - CreateEvent.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682396(v=vs.85).aspx

Пишу код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	HANDLE hEvent = CreateEvent( NULL, FALSE, FALSE, L"Global\\CSAPP" );
	DWORD dwErrorCode = GetLastError();
	if( dwErrorCode == ERROR_ALREADY_EXISTS )
	{
		wcout << "exist" << endl;
	}
	else
	{
		wcout << "new" << endl;
	}


Запускаю две программы одновременно. Теоретически, первый экземпляр приложения должен вывести new, второй - exist.
Под Windows 7, в одной сессии так и есть. Но под Windows 8.1 - нет! Оба пишут new.

Таки да, с появлением терминального сервера появились правила разделения нэймспейсов именованных объектов. Вот тут написано:
https://msdn.microsoft.com/en-us/library/aa382954(v=vs.85).aspx

Но у меня-то объект с именем Global\! Т.е. должен обнаруживаться!

То же самое и терминальными сессиями. На Windows 7 - одно приложение запускаю под одним пользователем, второе - под другим. Оба пишут new.

В чём засада, подскажите, уже весь мозг сломал!
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895749
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thВ чём засада, подскажите, уже весь мозг сломал!
Ты не проверяешь на другие ошибки, так что если получил ERROR_ACCESS_DENIED, выводишь "New".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895807
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, ну, у меня тут уже дерево из 50 условий, в т.ч. с проверкой ERROR_ALREADY_EXISTS, ERROR_ACCESS_DENIED, ERROR_INVALID_HANDLE, с использованием OpenEvent с разными флагами и т.д.. Общая фишка такая - в рамках одной сессии ещё кое-как можно обмениваться событиями. Между сессиями - никак, даже с административными правами и включением SeDebugPrivelege.

А нужно - именно между сессиями в терминальном сервере, и что бы работало на XP, 7, 8.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895826
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thдаже с административными правами и включением SeDebugPrivelege.
А нужно - SeCreateGlobalPrivilege. Проще всего этого добиться - запустить оба приложения
"As Administrator".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895832
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, Я ж написал - as administrator не помогает.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895857
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПроще всего этого добиться - запустить оба приложения
"As Administrator".
это слишком сильное требование
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895879
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задам более общий вопрос.
Как узнать, что приложение уже запущено на данном компьютере?
Метод должен работать на XP, 7, 8. В одной локальной или через несколько терминальных сессий. Должны обнаруживаться даже зависшие экземпляры приложений. Должно работать без административных прав.

Понятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895897
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
socket()+bind()+listen()
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895916
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее.
Почему не годится?
При первом запуске создавайте файлик с ID процесса.
При последующих запусках читайте файл и проверяйте существует ли процесс с таким ID.
Весь юниксовый мир использует эту технику.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895958
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВесь юниксовый мир использует эту технику.
Не совсем. ID процесса не проверяется, файл просто лочится на запись. Но у них есть
стандарт на структуру каталогов и гарантированное место с разрешением на запись. На винде
всё хуже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38895992
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНе совсем. ID процесса не проверяется, файл просто лочится на запись.
Не знал, спасибо.

Dimitry SibiryakovНа винде всё хуже.
Ну собственно, выше по топику видно, что даже более приспособленные для этого механизмы под виндой тоже не гарантировано работают. Тогда зачем усложнять когда можно проще ))
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896011
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thНо у меня-то объект с именем Global\! Т.е. должен обнаруживаться!
ЕМНИП где-то в политиках терминального сервера настраивается будет ли Global глобальным для всех терминальных сессий. По дефолту это отключено, т.е. Global\ одной терминальной сессии не виден в другой.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896024
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТогда зачем усложнять когда можно проще ))
Затем, что проще - нельзя. Нет на винде заранее известного общего каталога с
гарантированными разрешениями на создание файла любым пользователем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896031
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее.
Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896120
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, я проверял в обычной свежеустановленной Windows 7, там никто никаких гаек в терминальной сессии не закручивал. Созданные объекты с префиксом Global не находятся.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896124
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее.
Почему не годится?
При первом запуске создавайте файлик с ID процесса.
При последующих запусках читайте файл и проверяйте существует ли процесс с таким ID.
Весь юниксовый мир использует эту технику.
А если приложение зависнет? Его сняли, и под этим ID запустился блокнот. Fail!
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896136
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее.
Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела.

Думаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (:
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896145
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thDima T, я проверял в обычной свежеустановленной Windows 7, там никто никаких гаек в терминальной сессии не закручивал. Созданные объекты с префиксом Global не находятся.
Я писал про серверные виндовсы, возможно в 7-ке все точно также по дефолту, но только настраивать негде.

Я использовал mutex с именем Global\... для синхронизации между терминальными сессиями в Win2000 Server. Все отлично работало, пока админы не решили на 2003 пересесть. Там перестало работать. Нашли какую-то настройку в политиках, отключили/переключили - заработало. Что, где - не помню.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896175
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thDima Tпропущено...

Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела.

Думаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (:
Зачем он нужен?

Надо отталкиваться от того какие общие ресурсы использует прога. Тебе же не прогу надо однократно запустить, а однократно выполнить какую-то обработку данных. Если это какая-то файловая база - создай там файл. Если СУБД - используй средства СУБД.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896177
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, решение, похоже, такое.
1. Делаем OpenEvent с нашим ГЛОБАЛЬНЫМ именем. Если открылось - прилага уже запущена, делаем CloseHandle, выходим.
2. Если не открылось, и код ошибки ERROR_ACCESS_DENIED - мы в 7, 8, прилага открыта в другой сессии, выходим
3. Если не открылось, и код ошибки ERROR_FILE_NOT_FOUND - мы самые первые, делаем CreateEvent, запускаемся.

Проверил в XP, Server 2003, 7, 8, 8.1 работает. Надо бы ещё в Server 2012.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896183
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНадо отталкиваться от того какие общие ресурсы использует прога. Тебе же не прогу надо однократно запустить, а однократно выполнить какую-то обработку данных. Если это какая-то файловая база - создай там файл. Если СУБД - используй средства СУБД.
Общий ресурс - legacy функционал, под многопользование не заточенный. Отказаться от него - не вариант. "Создание там файла" не проходит по причине, в пятый раз пишу, "кто его удалит, если прилага зависнет?".
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896193
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thОбщий ресурс - legacy функционал, под многопользование не заточенный. Отказаться от него - не вариант. "Создание там файла" не проходит по причине, в пятый раз пишу, "кто его удалит, если прилага зависнет?".
Не надо его удалять если прога зависнет. Это прочитал?
Dima TСамый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела.
Не надо его к процессам привязывать. Просто назови my_proga_is_work.flg
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896207
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНе надо его удалять если прога зависнет. Это прочитал?

Это я прочитал.

Dima T13thДумаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (:
Зачем он нужен?

У нас серьёзный продукт. Сертификат - нужен. Механизм с файлом - не серьёзно, тут не unix.
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896281
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thDima Tпропущено...

Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела.

Думаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (:
Да нормуль способ. Юниксы так делают часто. Я-бы попробовал вместо файла создавать объекты
видимые в поле зрения ОС (Mutex например).

Пыщ до кучи
http://nsis.sourceforge.net/Check_whether_your_application_is_running
...
Рейтинг: 0 / 0
Вот это номер! CreatEvent - не работает!
    #38896290
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thМеханизм с файлом - не серьёзно,
named pipe тогда используйте
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вот это номер! CreatEvent - не работает!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]