Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 238
10.07.2016, 14:10     Запрет запуска второй копии приложений #1
Нужно запретить запуск второй копии чужого приложения.
Т.е. пользователь ткнул 5 раз на ярлык GTA5 в результате в процессе висит 2 GTA5, что не есть хорошо. Как этого можно избежать?
Пока что идея такова. Мое приложение висит в памяти. Ярылк переделывается на что-то вроде "C:\myprogramm\app.exe" -name "GTA5" -launcher "C:\Games\GTA5\GTAVplay.exe" -path "C:\Games\GTA5\GTAV.exe"
Параметры передаются в программу. Кстати, в какую сторону копать, как я понял так можно сделать?
Запускается игра по этим параметрам. Создается какой-то флаг. При повторном запуске проверяется этот флаг и если он есть, то просто никак не реагировать.

Гуглил про мютексы, но как я понял их можно использовать только для своих приложений. Потому что при создании приложения создается мютекс, при закрытии удаляется. Или прикручивать проверку закрыто приложение или нет. Ну или я что-то не так понял.

Ну и второй вариант начинать искать такой ехе уже в запущенных программах. И если есть он, то не запускать.
Еще, вроде как, если через creatprocess запустить программу, то можно отследить ее закрытие?

Может быть есть попроще способ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2016, 14:10     Запрет запуска второй копии приложений
Посмотрите здесь:

C++ конструктор копии
конструктор копии и операторы C++
Копии C++
Конструктор копии C++
C++ конструктор копии
C++ Конструкторы копии и перемещения
C++ Конструктор копии
Конструктор копии в Классах C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хрисипп
 Аватар для Хрисипп
17 / 27 / 8
Регистрация: 09.02.2016
Сообщений: 212
10.07.2016, 16:40     Запрет запуска второй копии приложений #2
можно запихнуть запуск в cmd файл( то бишь ярлык) и при его запуске будет открываться консоль(там уже можешь и написать что-нибудь,мол подождите) и пока игра не будет закрыта, не закроется и консоль
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 238
10.07.2016, 22:58  [ТС]     Запрет запуска второй копии приложений #3
можно запихнуть запуск в cmd файл( то бишь ярлык) и при его запуске будет открываться консоль(там уже можешь и написать что-нибудь,мол подождите) и пока игра не будет закрыта, не закроется и консоль
НЕ совсем понял, как мне это поможет

Пока нагородил такую конструкцию:
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE mutex;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{Application->ShowMainForm=false;
mutex=CreateMutex(NULL,true,L"MutexOfTheMyApplication");
DWORD result;
result = WaitForSingleObject(mutex,0);
UnicodeString path="";
if(result!=WAIT_OBJECT_0)
  {ShowMessage("Игра уже запущена. Если вы не видите игру, обратитесь к администратору");
 
  Application->Terminate();}
  else
  { for(int i=0;i<ParamCount()+1;i++)
     {if (ParamStr(i)=="-path"){i++; path=ParamStr(i);}
     }
    if(path==""){ShowMessage("Неверно указан путь, обратитесь к администратору");
    Application->Terminate();}
    else{STARTUPINFO cif;
    ZeroMemory(&cif,sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi;
 
    if(CreateProcess(path.c_str(), NULL,
     NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==true){
     WaitForSingleObject(pi.hProcess,INFINITE); }
     else {ShowMessage("Ошибка 2136. Обратитесь к администратору");}
     Application->Terminate();}  }
    }
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{ReleaseMutex(mutex);
CloseHandle(mutex);}
//---------------------------------------------------------------------------
Естественно нет обработки парочки ошибок. Причем как минимум одной критичной. И если игра запускается через лаунчер, то данная программа без модификации бесполезна. В принципе доделать не сложно. Как высплюсь, доделаю.
Yandex
Объявления
10.07.2016, 22:58     Запрет запуска второй копии приложений
Ответ Создать тему
Опции темы

Текущее время: 03:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru