Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/104: Рейтинг темы: голосов - 104, средняя оценка - 4.86
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319

Запрет запуска второй копии приложения

19.01.2010, 22:11. Показов 21192. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем огромный привет!!!!
Помогите пожалуйста! Как запретить запуск второй копии приложения?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2010, 22:11
Ответы с готовыми решениями:

Запрет запуска копии второй формы
Здравствуйте. Опять возник извечный вопрос. Есть базовая Форма1. На ней кнопка запуска Форма2. Так вот сам вопрос. Как отследить,...

Запрет запуска второй копии и перезапуск
Всем привет! Пытаюсь реализовать запрет на запуск второй копии приложения. Вот мой код: int WINAPI _tWinMain(HINSTANCE, HINSTANCE,...

Запрет запуска копии процесса
HWND hWnd; hWnd=::FindWindow(name,NULL); if (hWnd) { if (IsIconic(hWnd)) ShowWindow(hWnd,SW_RESTORE); ...

33
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
19.01.2010, 23:04
Лучший ответ Сообщение было отмечено как решение

Решение

Можно попробовать вот так:
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
HANDLE mutex;//Глобальный хендл мютекса
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//При открытии программы пытаемся создать мютекс.
//Мютекс - такой объект, который можно увидеть из любого приложения системы
mutex=CreateMutex(NULL,true,"MutexOfTheMyApplication");
DWORD result;
result = WaitForSingleObject(mutex,0);//А теперь пытаемся его захватить себе
//Если его захватить не получается, значит мютекс уже захватил кто-то другой
if(result!=WAIT_OBJECT_0)
  {
  ShowMessage("У вас уже запущена одна копия приложения");
  Application->ShowMainForm=false;
  Application->Terminate();
  }
}
 
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//При выключении программы освобождаем мютекс, если он был у нас захвачен
ReleaseMutex(mutex);
//И удаляем его.
CloseHandle(mutex);
}
Добавлено через 1 минуту
Кстати, Rapsod, я тебя попрошу, пиши нормальным шрифтом, без этих всяких там крупных синих букв.
5
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
19.01.2010, 23:23  [ТС]
Спасибо огромное!!! Все работает!!!)))
Все понял! Спасибо!
0
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
21.01.2010, 14:08  [ТС]
Возникла некая проблема.. когда снес программу.. она перестала вообще запускаться, некие модули запустились а сама прога почти умерла. Я так думаю что мьютекс не освободился..

А можно как-то с помощью PID процесса отследить запущенную прогу? Или например по ее имени, или адреса откуда была запущена?
Заранее спасибо!!!))
0
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
27.01.2010, 13:30  [ТС]
Цитата Сообщение от Rapsod Посмотреть сообщение
Возникла некая проблема.. когда снес программу.. она перестала вообще запускаться, некие модули запустились а сама прога почти умерла. Я так думаю что мьютекс не освободился..

А можно как-то с помощью PID процесса отследить запущенную прогу? Или например по ее имени, или адреса откуда была запущена?
Заранее спасибо!!!))
Неужели нету никаких вариантов?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
27.01.2010, 13:39
Так ведь ты можешь перебрать все процессы и сравнить PIDы. Вот только не совсем понятно, что значит отследить.
0
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
27.01.2010, 15:14  [ТС]
Цитата Сообщение от Otaka Посмотреть сообщение
Так ведь ты можешь перебрать все процессы и сравнить PIDы. Вот только не совсем понятно, что значит отследить.
Я имею введу что бы проверить по PID, запущена ли уже программа или нет. Если она уже запущена, то запретить запуск второй копии.
А то с мьютексом, не корректно работает.. (причина, если снести программу, то она не запустится, пока не будет перезагружен компьютер )
0
 Аватар для SunDrop
390 / 229 / 11
Регистрация: 09.12.2009
Сообщений: 668
27.01.2010, 16:15
Лучший ответ Сообщение было отмечено как решение

Решение

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
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    { 
        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "xxxx");
        if(!hMutex)
            hMutex = CreateMutex(0, 0, "xxxx");
        else
        {
            HWND hWnd = FindWindow(0, "xxxx");
            SetForegroundWindow(hWnd);
            ShowWindow(hWnd, SW_SHOW);
            return 0;
        }
 
        Application->Initialize();
        Application->Title = "xxxx";
 
        Application->Run();
        ReleaseMutex(hMutex);
        CloseHandle(hMutex);
 
    }
    catch(Exception &exception)
    {
        Application->ShowException(&exception);
    }
    return 0;
}
Абсолютно нормально и безглючно работает!
Даже если снимаю задачу или процесс.
В чем у тебя ошибка проявляется?
3
 Аватар для Oxotnuk
78 / 78 / 6
Регистрация: 18.06.2009
Сообщений: 533
24.03.2010, 18:10
Люди,помогите,как сделать запрет запуска приложения(программно на с++ builder)
Заранее спасибо
0
 Аватар для SunDrop
390 / 229 / 11
Регистрация: 09.12.2009
Сообщений: 668
24.03.2010, 18:24
Запуска вообще?
C++
1
2
3
4
5
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    Application->Terminate();
    return 0;
}
0
 Аватар для Oxotnuk
78 / 78 / 6
Регистрация: 18.06.2009
Сообщений: 533
24.03.2010, 18:25
Нет,именно указного приложения допустим бла.exe
0
 Аватар для SunDrop
390 / 229 / 11
Регистрация: 09.12.2009
Сообщений: 668
24.03.2010, 18:27
Цитата Сообщение от Oxotnuk Посмотреть сообщение
Нет,именно указного приложения допустим бла.exe
Вопрос не относится к указанной теме! Заводи отдельный топик
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
21.04.2011, 22:26
Добрый вечер! Пробую запретить повторный запуск приложения а оно всеравно запускается. Интересно почему? При этом компилятор не выдает ошибку.

вот код с программы:
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
 
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
TIniFile *Ini = new TIniFile("Source/options.ini");
//---------------------------------------------------------------------------
  
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    { 
        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "Project1.exe");
        if(!hMutex)
            hMutex = CreateMutex(0, 0, "Project1.exe");
        else
        {
            HWND hWnd = FindWindow(0, "Project1.exe");
            SetForegroundWindow(hWnd);
            ShowWindow(hWnd, SW_SHOW);
            return 0;
        }
 
        Application->Initialize();
        Application->Title = "Project1.exe";
 
        Application->Run();
        ReleaseMutex(hMutex);
        CloseHandle(hMutex);
 
    }
    catch(Exception &exception)
    {
        Application->ShowException(&exception);
    }
    return 0;
}
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.04.2011, 02:06
в файле .СРР проекта
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
44
45
46
47
48
49
50
51
52
53
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit.cpp", FormMain);
//---------------------------------------------------------------------------
const char *NamedMutex= "MySuperPuper{4FC5BAAF-BB97-4540-8BB5-19BC9CCDB00B}";
 
HANDLE CheckInstance(const char *Name)
{
    HANDLE Mutex = CreateMutex(NULL, true,Name);
    int er = GetLastError();
    if (er) return 0;
    return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HANDLE Mutex = CheckInstance(NamedMutex);
    if (!Mutex) {
    Application->MessageBox("Another imstance of \"MySuperPuper\" is running.",
                            "MySuperPuper",
                            MB_OK | MB_ICONINFORMATION);
    ReleaseMutex(Mutex);
// Знайшлосн відкрите вікно - виводимо його на перній план
    HWND hWnd = FindWindow( 0, "MySuperPuper");
    SetForegroundWindow(hWnd);
return 1;
}
    try
    {
         Application->Initialize();
         Application->Title = "MySuperPuper";
         Application->CreateForm(__classid(TFormMain), &FormMain);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }
    return 0;
}
//---------------------------------------------------------------------------
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
22.04.2011, 04:56
Сделал все вроде правильно, а всеравно не работает функция...

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", FormMain);//Здесь я добавил 1 к unit.cpp а толку нет:(
//---------------------------------------------------------------------------
TForm1 *Form1;
TIniFile *Ini = new TIniFile("Source/options.ini");
//---------------------------------------------------------------------------
const char *NamedMutex= "MySuperPuper{4FC5BAAF-BB97-4540-8BB5-19BC9CCDB00B}";
 
HANDLE CheckInstance(const char *Name)
{
        HANDLE Mutex = CreateMutex(NULL, true,Name);
        int er = GetLastError();
        if (er) return 0;
        return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        HANDLE Mutex = CheckInstance(NamedMutex);
        if (!Mutex) {
        Application->MessageBox("Another imstance of \"Project1.exe\" is running.",
                                                    "Project1.exe",
                                                        MB_OK | MB_ICONINFORMATION);
        ReleaseMutex(Mutex);
// Çíàéøëîñí â³äêðèòå â³êíî - âèâîäèìî éîãî íà ïåðí³é ïëàí
        HWND hWnd = FindWindow( 0, "Project1.exe");
        SetForegroundWindow(hWnd);
return 1;
}
    try
    {
         Application->Initialize();
         Application->Title = "Project1.exe";
         Application->CreateForm(__classid(TFormMain), &FormMain);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("Project1.exe");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }
    return 0;
}
//------------------------------------------------------------
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.04.2011, 06:00
C++
1
2
3
4
5
6
7
8
9
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    CreateMutex( NULL, true, "MySuperProgram" );
        if ( GetLastError() == ERROR_ALREADY_EXISTS )
        {
            exit(0);
        }
}
3
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
22.04.2011, 08:46
Все работает! Спасибо всем учасникам темы!
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
22.04.2011, 15:24
вот это - 4FC5BAAF-BB97-4540-8BB5-19BC9CCDB00B - у тебя должно быть свое - оно как-то там генерируется, не помню, как, может, кто подскажет ?
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
22.04.2011, 15:30
Цитата Сообщение от LK Посмотреть сообщение
вот это - 4FC5BAAF-BB97-4540-8BB5-19BC9CCDB00B - у тебя должно быть свое - оно как-то там генерируется, не помню, как, может, кто подскажет ?
вместо 4FC5BAAF-BB97-4540-8BB5-19BC9CCDB00B может быть что угодно, например, "1"
это просто какое-то название. обычно оно совпадает с названием программы.
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
19.10.2011, 02:53
возвращаясь к теме с легкой руки уважаемого Samrisbe......
Цитата Сообщение от kzru_hunter Посмотреть сообщение
вместо 4FC5BAAF-BB97-4540-8BB5-19BC9CCDB00B может быть что угодно, например, "1"
это просто какое-то название. обычно оно совпадает с названием программы.
- не все так просто:
GUID (Globally Unique Identifier)

а про "забыл" я просто пошутил , а потом - забыл ...

генерируется оно просто - достаточно в Билдере нажать комбинацию из трех пальцев: Ctrl+Shift+G
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2011, 02:53
Помогаю со студенческими работами здесь

Запрет запуска приложения
Люди помогите пожалуйста,нужно запретить запуск определенного приложения допустим *.exe(программно на с++\builder) Заранее блогодарен.

Запрет запуска второй копии приложения
Добрый вечер всем. Собственно говоря вопрос в теме. Гугл говорит, что нужно использовать qtsingleapplication. Только я не совсем понял как...

Запрет запуска второй копии приложений
Нужно запретить запуск второй копии чужого приложения. Т.е. пользователь ткнул 5 раз на ярлык GTA5 в результате в процессе висит 2 GTA5,...

MFC. Запрет запуска второй копии программы
Здравстуйте. В главе 3 книги Дж. Рихтера есть простая реализация примера для запрета запуска второй копии программы. Пытаюсь ее...

Запрет запуска копии приложения
Недавно перешел на Linux, и если на винде в интернетах полно примеров, как запретить повторный запуск уже рабочего приложения (через...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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