Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308

Запуск программы, только через мой лаунчер

28.08.2017, 01:03. Показов 2634. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, задался таким вопросом, а возможно ли как-то запретить запуск моей программы вообще, но только что бы она запускалась через лаунчер. Программа написана тоже на c++ builder. И если возможно не под скажете как это можно реализовать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.08.2017, 01:03
Ответы с готовыми решениями:

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

Ноутбук не видит только мой wifi но подключается к нему через телефон
Привет. Мой ноу asus f402c c Ralink 802.11n Wireless Lan Card, установил новую 8.1 pro. Адаптер видит соседние подключения даже которые...

Запуск программы только с флешкой
В общем надо чтобы программа запускалась только с флешкой. На одной из веток нашла идею, что можно поместить на флешку как-то файл, и если...

13
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
28.08.2017, 08:36
Можно в параметрах запуска указывать ключ. При запуске программы - проверять этот ключ, и если что - прерывать запуск основной программы.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
28.08.2017, 09:39
А можно при запуске приложения находить себя в списке процессов, и проверять, что для текущего процесса является родительским. Если launcher - то все нормально, если нет - то быстро самозакрываться
2
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
28.08.2017, 18:12  [ТС]
Если не сложно, не могли бы вы для начала показать на примере, как найти процесс. Просто я с этим еще не сталкивался, но довольно интересно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
29.08.2017, 12:02
Determine the parent process of the current app, например
2
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
29.08.2017, 16:13  [ТС]
Пытаюсь переписать данный код на с++, но столкнулся с такой проблемой, E2268 Call to undefined function 'SetLength'.
Хотя функция в delphi похожа на с++
Delphi
1
procedure SetLength(var S; NewLength: Integer);
C++
1
SetLength( S, int NewLength);
Но компилятор пишет. Обращение к неопределенной функции.
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
const BufferSize = 4096;
HANDLE HandleSnapShot;
PROCESSENTRY32 EntryParentProc;
DWORD CurrentProcessId;
HANDLE HandleParentProc;
DWORD ParentProcessId;
bool ParentProcessFound;
String ParentProcPath;
 
ParentProcessFound = false;
HandleSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (HandleSnapShot != INVALID_HANDLE_VALUE) {
    EntryParentProc.dwSize = sizeof(EntryParentProc);
    if (Process32First(HandleSnapShot, &EntryParentProc)) {
        CurrentProcessId = GetCurrentProcessId();
        //do
        if (EntryParentProc.th32ProcessID == CurrentProcessId) {
            ParentProcessId = EntryParentProc.th32ParentProcessID;
            HandleParentProc = OpenProcess(PROCESS_QUERY_INFORMATION |
                                           PROCESS_VM_READ, False, 
                                           ParentProcessId);
           if (HandleParentProc != 0) {
               ParentProcessFound = true;
               SetLength(ParentProcPath, BufferSize);
              }
              
           }
           
        }
        
   }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
29.08.2017, 17:06
В С++ SetLength - это метод класса String:
C++
1
ParentProcPath.SetLength(BufferSize);
, хотя зачем переводить вообще? Билдер прекрасно компилирует коды на Дельфи, вынеси эту функцию в отдельный pas-модуль, и просто подключи его к проекту.
2
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
29.08.2017, 20:13  [ТС]
Эх, если честно, то что-то и в голову не пришло, что так можно сделать
Немного помучился и написал вот это чудо, если не сложно проверти, не допустил ли я ошибок.
Просто с delphi работаю первый раз.
И если не сложно, объясните пожалуйста, как эта функция возвращает родительский процесс. Просто пытался вывести ее в Memo1, но получаю пустоту.
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
const BufferSize = 4096;
HANDLE HandleSnapShot;
PROCESSENTRY32 EntryParentProc;
DWORD CurrentProcessId;
HANDLE HandleParentProc;
DWORD ParentProcessId;
bool ParentProcessFound;
String ParentProcPath;
 
ParentProcessFound = false;
HandleSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (HandleSnapShot != INVALID_HANDLE_VALUE) {
    EntryParentProc.dwSize = sizeof(EntryParentProc);
    if (Process32First(HandleSnapShot, &EntryParentProc)) {
        CurrentProcessId = GetCurrentProcessId();
        do
        if (EntryParentProc.th32ProcessID == CurrentProcessId) {
            ParentProcessId = EntryParentProc.th32ParentProcessID;
            HandleParentProc = OpenProcess(PROCESS_QUERY_INFORMATION |
                                           PROCESS_VM_READ, False, 
                                           ParentProcessId);
           if (HandleParentProc != 0) {
               ParentProcessFound = true;
               ParentProcPath.SetLength(BufferSize);
               GetModuleFileNameEx(HandleParentProc , 0, String(ParentProcPath).c_str(), BufferSize);
               ParentProcPath = String(ParentProcPath).c_str();
               CloseHandle(HandleParentProc);
              }
           break;     
           }
 
        while (!Process32Next(HandleSnapShot, &EntryParentProc));
        }
   CloseHandle(HandleSnapShot);     
   }
 
String Result;
 
if (ParentProcessFound) {
   Result = ParentProcPath;
   }
else {
   Result = "";
   }
Добавлено через 2 часа 46 минут
Не могу понять по чему, но теперь при запуске приложения через launcher. Функция все равно возвращает значение
C++
1
Result = "";
Запускаю приложение из launchera так
C++
1
ShellExecute (Handle, L"open",L"C:\\Name.exe",NULL,NULL, SW_RESTORE);
0
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
29.08.2017, 22:56
Лучший ответ Сообщение было отмечено Reavolt как решение

Решение

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
#include <vcl.h>
#pragma hdrstop
#include <tlhelp32.h>
#define PSAPI_VERSION 2  //без этого у меня ругается на GetModuleFileNameEx
#include <Psapi.h>
 
#include "UF_Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TF_Main *F_Main;
//---------------------------------------------------------------------------
__fastcall TF_Main::TF_Main(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
String GetTheParentProcessFileName()
{
    String ParentProcPath = L"";
 
    HANDLE HandleSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   //enumerate the process
    if (HandleSnapShot == INVALID_HANDLE_VALUE)
        return L"";
 
    PROCESSENTRY32 EntryParentProc;
    EntryParentProc.dwSize = sizeof(EntryParentProc);
    if (Process32First(HandleSnapShot, &EntryParentProc))    //find the first process
    {
        DWORD CurrentProcessId = GetCurrentProcessId(); //get the id of the current process
        while (Process32Next(HandleSnapShot, &EntryParentProc))
        {
            if (EntryParentProc.th32ProcessID != CurrentProcessId)
                continue;           
            HANDLE HandleParentProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, EntryParentProc.th32ParentProcessID);
            if (HandleParentProc)
            {               
                ParentProcPath.SetLength(4096);
                GetModuleFileNameEx(HandleParentProc, 0, ParentProcPath.c_str(), 4096);
                CloseHandle(HandleParentProc);
            }
            break;
            
        }       
    }
    CloseHandle(HandleSnapShot);
 
    return ParentProcPath;
}
 
void __fastcall TF_Main::Button1Click(TObject *Sender)
{
    ShowMessage(GetTheParentProcessFileName());
}
Добавлено через 4 минуты
У тебя как минимум ошибка в условии while, там не нужно отрицание.
while выполняется, пока условие true. until выполняется, пока условие не станет true(т. е. пока условие false).

Добавлено через 7 минут
кажется do while следует заменить на простой while. Исправил.
2
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
30.08.2017, 08:27  [ТС]
Lelik-pahan, Функция работает, если я запускаю ее через builder или просто через exe где она написана.
через builder получаю C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\bds.exe
а через exe C:\Windows\explorer.exe но если запускаю через launcher получаю пустую строку, в чем может быть проблема? Возможно нужно делать запуск как-то по другому?

Добавлено через 12 минут
Ну да, дело видимо было в открытии, вот так показывает процесс Launchera. C:\Users\Reavolt\Desktop\Challenge\Launcher\Win32\Debug\PLauncher.exe
C++
1
2
ShellExecute(Handle, NULL, L"C:\\Users\\Reavolt\\Desktop\\Challenge\\Win32\\Debug\\PChallenge.exe",
L"C:\\Users\\Reavolt\\Desktop\\Challenge\\Launcher\\Win32\\Debug\\PLauncher.exe", NULL, SW_RESTORE);
0
 Аватар для S0lexV
21 / 21 / 7
Регистрация: 27.07.2011
Сообщений: 330
31.08.2017, 19:50
я делал проще:
берешь флаг (true/false) или другое что угодно
при запуске через лаунчер пишиешь флаг = true (можно в файл просто, можно в реестр)
Дальше лаунчер запускает целевую прогу
В целевой проге проверяешь флаг - если true то все ок если false то крашишь прогу
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.08.2017, 19:56
Цитата Сообщение от Reavolt Посмотреть сообщение
Здравствуйте, задался таким вопросом, а возможно ли как-то запретить запуск моей программы вообще, но только что бы она запускалась через лаунчер.
"Вообще" нельзя

А что ты пытаешься решить? Точнее, с кем пытаешься бороться? Просто с неквалифицированным пользователем, чтобы не запускал программу через проводник, или с экспертом, который взламывает подобную "защиту"?
0
 Аватар для Reavolt
139 / 67 / 46
Регистрация: 15.10.2015
Сообщений: 308
31.08.2017, 20:39  [ТС]
Evg, Cкорее с неквалифицированным пользователем, что бы бороться с теме, которые взламывают подобную "защиту" мне не хватит знаний как минимум. А так я просто делал Launcher, который обновляет приложение ну и настройки всякие, а запуск решил запретить, что бы пользователи запускали программу только через launcher.

Добавлено через 5 минут
S0lexV, Можно, но я решил немножко запарится и сделать посложнее. В принципе результатом доволен, хоть получилось не все и идеально.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.08.2017, 21:00
Цитата Сообщение от Reavolt Посмотреть сообщение
Cкорее с неквалифицированным пользователем
Тогда совет из поста #2

Остальное приведёт к ровно таким же результатам, только с гораздо более высокими затратами на разработку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2017, 21:00
Помогаю со студенческими работами здесь

Одновременный запуск только 5 копий программы
Помню как все одно время набил оскомину вопрос, как же запретить повторный запуск программы. А мне надо разрешить 5 повторных запусков, а...

Запуск только одной программы на удаленном компьютере
Здравствуйте! Написал программу. Заказчик настоятельно порекомендовал программу держать именно на удаленном компьютере. Через TeamViewer...

Запуск приложения только через апдейтер
есть 2 программы 1 программа - апдейтер (обновление файлов второй программы + ее запуск) 2 программа - программа которою будем...

Запуск ОС возможен только через биос
Доброго времени суток. После переустановки вин 10 столкнулся с проблемой, а именно при включении ноутбука, после логотипа, становится...

Запуск win 10 только через кнопку reboot
Обновился с WIN-7 PRO на 10-ку PRO. Сразу вылезла проблема. При включении компа, после экрана BIOS появляется окно с крутящимся кружком и...


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

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