Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1

Работа с Mutant'ами

26.09.2011, 12:58. Показов 2191. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема следующая:

Есть приложение, копию которого можно запустить, только если убить в нем один Mutant.
Я написал консольное приложение, которое запускается, уничтожает этот Mutant и закрывается.
Копия приложения открывается успешно. Задача решена.

Теперь я хочу перенести свой код в программу WPF, перенес все классы, код запускается по нажатию кнопки, убивает Mutant, со стороны вроде всё нормально, проверяю ProcessExplorer'ом, действительно мутант убит, но копия приложения не открывается.

Копия открывается только после завершения моей WPF программы.

Создается впечатление что WPF программа, не отпускает убитый Mutant пока не завершится.
Как можно исправить проблему? Нужно чтобы все нормально убивалось без завершения WPF программы.
Сталкивался кто-нибудь с этим?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2011, 12:58
Ответы с готовыми решениями:

Нужна летиратура, в которой бы описывались работа с событиями, работа с элементами управления
Помогите пожалуйста найти летиратуру, в которой бы описывались работа с событиями,работа со всеми элементами управления(toolbox).И если...

Работа - проведение обучающих семинаров по C#. Работа по выходным дням ( сб-вс - 32 часа). От 30 000р.
Обязанности - проведение обучающих семинаров по C# Базовый (начальный уровень). Опыт преподавания не обязателен, главное чтобы вы не...

Работа с Меню. Сохранение, печать, создать новый. Работа с рисованием
В общем сабж. Делается программа, которая должная Сохранять, печатать и очищать поле (создать новый/очистка). Также хочу спросить как...

16
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.09.2011, 17:08
Что за мутанты ? Может Mutex?

Не по теме:

Странно, что никто не спросил до меня это. Думаю не каждый знает, что за мутанты, гугл не даёт результатов.

0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
26.09.2011, 18:44  [ТС]

Хэндлы окна, если я не ошибаюсь то то-же самое что и Mutex

Добавлено через 6 минут
Есть конечно и другой вариант, из WPF Программы запускать по кнопке консольное приложение, которое будет открываться, работать, закрываться, и все счастливы. Но не хочется таскать за собой лишний экзешник, вшить в прогу можно его как-нибудь?
0
87 / 86 / 13
Регистрация: 21.10.2010
Сообщений: 349
26.09.2011, 19:02
C#
1
2
3
4
5
6
7
8
bool firstInstanse;
            System.Threading..Mutex = new System.Threading.Mutex(false, "Название проекта", out firstInstanse);
 
            if (!firstInstanse) 
            {
                System.Windows.Forms.MessageBox.Show("Копия программы уже запущена", "", System.Windows.Forms.MessageBoxButtons.OKCancel, System.Windows.Forms.MessageBoxIcon.Information);
                this.Close();
            }
И не надо ни каких консольных приложений
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.09.2011, 19:03
Можно вообще компилировать прогу из какого-то кода. То есть запускаешь свою программу и жмёшь кнопку, прога компилит определённый код и появляется эксешник, но в твоём случае это походу перебор будет, да и надо ли оно вообще. Проще наверное эксешник таскать или поместить эксешник в ресурсы программы и при нажатии извлекать его и запускать, потом наверное удалять (если нужно).

Добавлено через 55 секунд
Дык надо чтобы один экземпляр приложения запускался что ли?
0
87 / 86 / 13
Регистрация: 21.10.2010
Сообщений: 349
26.09.2011, 19:03
Кидаешь это в MainWindow в метод инициализации окна.
0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
26.09.2011, 19:19  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Проще наверное эксешник таскать или поместить эксешник в ресурсы программы и при нажатии извлекать его и запускать, потом наверное удалять (если нужно).
Можно какие-нибудь ссылки на примеры?

Цитата Сообщение от Casper-SC Посмотреть сообщение
Добавлено через 55 секунд
Дык надо чтобы один экземпляр приложения запускался что ли?
Нет. Есть игра, я хочу запустить 3 копии игры одновременно. Она не позволяет этого сделать, но если я убиваю в ней Mutant, то всё окей. Консольная прога работает, запускается, убивает мутант, закрывается, всё ок. А проблема описана в начале поста, WPF удаляет мутант только когда завершается само wpf приложение. (как-то так).

Цитата Сообщение от Vangok Посмотреть сообщение
Кидаешь это в MainWindow в метод инициализации окна.
Что делает этот код?
0
87 / 86 / 13
Регистрация: 21.10.2010
Сообщений: 349
26.09.2011, 19:24
Данный код убивает копию программы.
0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
26.09.2011, 19:30  [ТС]
Мне не нужно убивать копии, темболее своей программы=) Прочитайте пожалуйста еще раз пост с проблемой
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.09.2011, 20:12
Цитата Сообщение от EatingPeopleIsFun Посмотреть сообщение
Нет. Есть игра, я хочу запустить 3 копии игры одновременно. Она не позволяет этого сделать, но если я убиваю в ней Mutant, то всё окей. Консольная прога работает, запускается, убивает мутант, закрывается, всё ок. А проблема описана в начале поста, WPF удаляет мутант только когда завершается само wpf приложение. (как-то так).
А то есть есть какая-то игра, которая по задумке не позволяет запустить себя больше одной копии, ты пишешь программу, которая обманывает игру и позволяет запустить 3 копии одновременно?

Ты написал консольное приложение, всё пашет, ты хочешь перенести на WPF, но там не пашет?

Так покажи код консольной проги (ну думаю он не сверхсекретный, при желании и усидчивости например я сам спокойно нагуглю что к чему (если там не нужно быть супер продвинутым хакером) и напишу свою запускалку). И покажи как ты используешь этот код в WPF. Только подробнее, тупо показать 1 метод ничего не показать, покажи как и откуда ты его вызываешь например. Или вообще весь код. С этого и нужно было начинать мне кажется. А поместить консольное приложение в ресурсы конечно можно, но мне кажется надо делать не через одно место и решать проблемы, а не обходить их используя костыли.
0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
26.09.2011, 21:14  [ТС]
код нагуглить можно, но он довольно объемный (около 400 строк), с вызовом WinApi функций

да ты понял меня правильно, но - код работает и в wpf приложении и в консольном, но пока приложение открыто (и консольное и wpf мое), новая копия игры не запускается (хотя мьютекс удален).
стоит только закрыть приложение , и копия игры сразу запускается, всвязи с этим складывается впечатление, что приложение не до конца мьютекс убивает, и как будто держит до закрытия.

вот код основного класса, остальные опустил, но вроде интуитивно понятно немного.
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
class Program
    {
        static void Main(string[] args)
        {
            deleteMutex("Имя процесса", "Имя мьютекса");
           // Console.ReadLine();
        }
 
        static void deleteMutex(string ProcessName, string MutexName)
        {
            Process[] pr = Process.GetProcessesByName(ProcessName);
            int count = 1;
            Console.WriteLine("Обнаружено {0} процесса {1}", pr.Length, ProcessName);
 
            foreach (Process process in pr)
            {
                try
                {
                    var handles = Win32Processes.GetHandles(process, "Mutant", "\\Sessions\\1\\BaseNamedObjects\\" + MutexName);
                    Console.WriteLine("Поиск в {0} процессе",count);
                    count++;
                    if (handles.Count == 0) throw new System.ArgumentException("NoMutex", "original");
                    foreach (var handle in handles)
                    {
                        Console.WriteLine("Mutex DETECTED");
                        IntPtr ipHandle = IntPtr.Zero;
                        if (!Win32API.DuplicateHandle(Process.GetProcessById(handle.ProcessID).Handle, handle.Handle, Win32API.GetCurrentProcess(), out ipHandle, 0, false, Win32API.DUPLICATE_CLOSE_SOURCE))
                            Console.WriteLine("DuplicateHandle() failed, error = {0}", Marshal.GetLastWin32Error());
 
                        Console.WriteLine("Мьютекс уничтожен!");
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    Console.WriteLine("Процесс '{0}' не запущен", ProcessName);
                }
                catch (ArgumentException)
                {
                    Console.WriteLine("Мьютекс '{0}' не найден в процессе '{1}'", MutexName, ProcessName);
                }
            }
        }
    }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
26.09.2011, 21:32
DuplicateHandle копирует Handle мьютекса и закрывает основной возвращая копию? Или я что-то не понял?
0
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
26.09.2011, 23:42  [ТС]
Вычитал что с помощью дупликейтхэндла только и можно удалить.
Выходит проблема может быть в нем? в этой копии?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
27.09.2011, 00:18
Цитата Сообщение от EatingPeopleIsFun Посмотреть сообщение
Вычитал что с помощью дупликейтхэндла только и можно удалить
Неа (видимо не только удалить). DuplicateHandle.

Это конечно предположение сделанное вообще наугад, но может надо второй хэндл закрывать? CloseHandle
Может кто-то что-нибудь скажет, если разбирается?
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.09.2011, 01:02
EatingPeopleIsFun, на самом деле всё должно быть не так сложно. Если посмотреть внутрь метода GetHandles, то Вы увидите что он использует 2 метода: getObjectTypeName и getObjectName (притом по несколько раз), и в каждом из этих методов вызывается DuplicateHandle, т.е. происходит копирование одного объекта по несколько раз, и после использования объекты не закрываются, а остаются висеть в Вашем приложении (а мьютексы, скорее всего глобальные, поэтому если он существует в каком-то приложении, то и нужное Вам приложение уже считает себя запущенным).
Вывод: закройте объекты после использования, в каждом из методов (используйте Win32Api.CloseHandle(ipHandle)). Попробуйте...
1
70 / 69 / 10
Регистрация: 14.06.2009
Сообщений: 310
Записей в блоге: 1
27.09.2011, 08:32  [ТС]
Проанализировал свою программу через ProcessExplorer. Когда запускаю ёё, и она ищет мьютексы, то копирует кучу хэндлов из окна игры: Key, File, Process, Thread, а также и наши Mutantы.
и Действительно они висят в проге,
SSTREGG,Casper-SC, вы были правы.
Пробежал по коду, в getObjectTypeName не было CloseHandle - добавил.
В коде, который показывал здесь немного раньше, тоже добавил.
В итоге => Мьютексы которые мне нужны высвобождаются из программы, и всё заработало! копии запускаются, спасибо большое!

И один недочёт, что делать с той горой мусора которая всё таки остается висеть в программе? По хорошему её надо как то вычищать? Она возникает из-за ошибок в реализации?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.09.2011, 00:59
Цитата Сообщение от EatingPeopleIsFun Посмотреть сообщение
И один недочёт, что делать с той горой мусора которая всё таки остается висеть в программе?
Закрывать когда в ней нет необходимости.
Цитата Сообщение от EatingPeopleIsFun Посмотреть сообщение
Она возникает из-за ошибок в реализации?
Скорее всего, да. Надо изучить более детально код чтобы понять чего именно добивался автор. Скорее всего, просто чтобы можно было найти нужный объект.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2011, 00:59
Помогаю со студенческими работами здесь

Работа формы в фоне, вне фокуса (работа с раскладкой клавиатуры)
Как заставить это работать в фоне? Даный код работает пока форма в фокусе, как только ее отпускаем - она не реагирует. Public...

Количество подведенного и отведенного тепла, работа сжатия, работа расширения
Определить количество подведенного и отведенного тепла, работу сжатия, работу расширения, полезную работу и КПД цикла предыдущей...

Работа с файловой системой (системное название некоторых папок и работа со скрытыми документами)
Всем привет, подскажите каким образом можно из VBA сохранить документ txt в папке "Общие документы" и задать для него свойство...

Нужна книга, где рассматриваются работа с прерываниями, указатели, работа с памятью, ассемблерные вставки
Привет всем! Подскажите, пожалуйста, хорошую книгу по C (именно C, не C++). Интересует работа с прерываниями, указатели, работа с памятью,...

Symfony2, работа с типом Collection, работа с базовой формой
Здравствуйте. Осваиваю создание CRUD приложения на Symfony 2, на примере. Однако, возникают ошибки: 1)При модификации шаблона...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru