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

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

26.09.2011, 12:58. Показов 2197. Ответов 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
8728 / 3680 / 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
8728 / 3680 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru