Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Есть такая известная всем функция 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. Запускаю две программы одновременно. Теоретически, первый экземпляр приложения должен вывести new, второй - exist. Под Windows 7, в одной сессии так и есть. Но под Windows 8.1 - нет! Оба пишут new. Таки да, с появлением терминального сервера появились правила разделения нэймспейсов именованных объектов. Вот тут написано: https://msdn.microsoft.com/en-us/library/aa382954(v=vs.85).aspx Но у меня-то объект с именем Global\! Т.е. должен обнаруживаться! То же самое и терминальными сессиями. На Windows 7 - одно приложение запускаю под одним пользователем, второе - под другим. Оба пишут new. В чём засада, подскажите, уже весь мозг сломал! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 11:49 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thВ чём засада, подскажите, уже весь мозг сломал! Ты не проверяешь на другие ошибки, так что если получил ERROR_ACCESS_DENIED, выводишь "New". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 12:09 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, ну, у меня тут уже дерево из 50 условий, в т.ч. с проверкой ERROR_ALREADY_EXISTS, ERROR_ACCESS_DENIED, ERROR_INVALID_HANDLE, с использованием OpenEvent с разными флагами и т.д.. Общая фишка такая - в рамках одной сессии ещё кое-как можно обмениваться событиями. Между сессиями - никак, даже с административными правами и включением SeDebugPrivelege. А нужно - именно между сессиями в терминальном сервере, и что бы работало на XP, 7, 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 12:38 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thдаже с административными правами и включением SeDebugPrivelege. А нужно - SeCreateGlobalPrivilege. Проще всего этого добиться - запустить оба приложения "As Administrator". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 12:50 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Я ж написал - as administrator не помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 12:51 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПроще всего этого добиться - запустить оба приложения "As Administrator". это слишком сильное требование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 13:09 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Задам более общий вопрос. Как узнать, что приложение уже запущено на данном компьютере? Метод должен работать на XP, 7, 8. В одной локальной или через несколько терминальных сессий. Должны обнаруживаться даже зависшие экземпляры приложений. Должно работать без административных прав. Понятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 13:20 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
socket()+bind()+listen() Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 13:29 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее. Почему не годится? При первом запуске создавайте файлик с ID процесса. При последующих запусках читайте файл и проверяйте существует ли процесс с таким ID. Весь юниксовый мир использует эту технику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 13:35 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВесь юниксовый мир использует эту технику. Не совсем. ID процесса не проверяется, файл просто лочится на запись. Но у них есть стандарт на структуру каталогов и гарантированное место с разрешением на запись. На винде всё хуже. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 13:55 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНе совсем. ID процесса не проверяется, файл просто лочится на запись. Не знал, спасибо. Dimitry SibiryakovНа винде всё хуже. Ну собственно, выше по топику видно, что даже более приспособленные для этого механизмы под виндой тоже не гарантировано работают. Тогда зачем усложнять когда можно проще )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 14:17 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thНо у меня-то объект с именем Global\! Т.е. должен обнаруживаться! ЕМНИП где-то в политиках терминального сервера настраивается будет ли Global глобальным для всех терминальных сессий. По дефолту это отключено, т.е. Global\ одной терминальной сессии не виден в другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 14:24 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТогда зачем усложнять когда можно проще )) Затем, что проще - нельзя. Нет на винде заранее известного общего каталога с гарантированными разрешениями на создание файла любым пользователем. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 14:28 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее. Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 14:31 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dima T, я проверял в обычной свежеустановленной Windows 7, там никто никаких гаек в терминальной сессии не закручивал. Созданные объекты с префиксом Global не находятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:12 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее. Почему не годится? При первом запуске создавайте файлик с ID процесса. При последующих запусках читайте файл и проверяйте существует ли процесс с таким ID. Весь юниксовый мир использует эту технику. А если приложение зависнет? Его сняли, и под этим ID запустился блокнот. Fail! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:13 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dima T13thПонятно, что метод "с созданием файлика" не годится, нужно что-то посерьёзнее. Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела. Думаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:19 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thDima T, я проверял в обычной свежеустановленной Windows 7, там никто никаких гаек в терминальной сессии не закручивал. Созданные объекты с префиксом Global не находятся. Я писал про серверные виндовсы, возможно в 7-ке все точно также по дефолту, но только настраивать негде. Я использовал mutex с именем Global\... для синхронизации между терминальными сессиями в Win2000 Server. Все отлично работало, пока админы не решили на 2003 пересесть. Там перестало работать. Нашли какую-то настройку в политиках, отключили/переключили - заработало. Что, где - не помню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:23 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thDima Tпропущено... Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела. Думаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (: Зачем он нужен? Надо отталкиваться от того какие общие ресурсы использует прога. Тебе же не прогу надо однократно запустить, а однократно выполнить какую-то обработку данных. Если это какая-то файловая база - создай там файл. Если СУБД - используй средства СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:39 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
В общем, решение, похоже, такое. 1. Делаем OpenEvent с нашим ГЛОБАЛЬНЫМ именем. Если открылось - прилага уже запущена, делаем CloseHandle, выходим. 2. Если не открылось, и код ошибки ERROR_ACCESS_DENIED - мы в 7, 8, прилага открыта в другой сессии, выходим 3. Если не открылось, и код ошибки ERROR_FILE_NOT_FOUND - мы самые первые, делаем CreateEvent, запускаемся. Проверил в XP, Server 2003, 7, 8, 8.1 работает. Надо бы ещё в Server 2012. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:41 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dima TНадо отталкиваться от того какие общие ресурсы использует прога. Тебе же не прогу надо однократно запустить, а однократно выполнить какую-то обработку данных. Если это какая-то файловая база - создай там файл. Если СУБД - используй средства СУБД. Общий ресурс - legacy функционал, под многопользование не заточенный. Отказаться от него - не вариант. "Создание там файла" не проходит по причине, в пятый раз пишу, "кто его удалит, если прилага зависнет?". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:44 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thОбщий ресурс - legacy функционал, под многопользование не заточенный. Отказаться от него - не вариант. "Создание там файла" не проходит по причине, в пятый раз пишу, "кто его удалит, если прилага зависнет?". Не надо его удалять если прога зависнет. Это прочитал? Dima TСамый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела. Не надо его к процессам привязывать. Просто назови my_proga_is_work.flg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:50 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
Dima TНе надо его удалять если прога зависнет. Это прочитал? Это я прочитал. Dima T13thДумаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (: Зачем он нужен? У нас серьёзный продукт. Сертификат - нужен. Механизм с файлом - не серьёзно, тут не unix. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 15:55 |
|
||
|
Вот это номер! CreatEvent - не работает!
|
|||
|---|---|---|---|
|
#18+
13thDima Tпропущено... Самый надежный метод быть уверенным что прогу никто не запустит дважды. Работает как в терминале, так и по сети. При входе открываешь файлик на запись и держишь открытым, при выходе закрываешь и удаляешь. Второй открыть не сможет. Если прога вылетит - ОС файлик закроет, в следующий запуск факт наличия файлика оповестит что прога вылетела. Думаешь, программа, реализующая этот алгоритм получит сертификат "Windows 8-ready?" (: Да нормуль способ. Юниксы так делают часто. Я-бы попробовал вместо файла создавать объекты видимые в поле зрения ОС (Mutex например). Пыщ до кучи http://nsis.sourceforge.net/Check_whether_your_application_is_running ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2015, 16:31 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38896031&tid=2018709]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 275ms |
| total: | 452ms |

| 0 / 0 |
