Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 05.01.2015
Сообщений: 26

Передача дескрипторов через параметры командной строки

06.11.2016, 20:22. Показов 2839. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема такая. Я через параметры командной строки передаю Дескрипторы в дочерний процесс. В этом дочернем процессе, с помощью этих дескрипторов мне надо создать дубликат объекта, но он не создается. В чем может быть проблема ??
C++ (Qt)
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
int _tmain(int argc, char *argv[])
{
    if (argc == 1)
    {
        STARTUPINFO si = { sizeof(STARTUPINFO) };
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(STARTUPINFO));
        TCHAR szCmdLine[MAX_PATH];
        TCHAR str[64];
        BOOL bRet;
        HANDLE Parent=OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId()); //получаю дескриптор Процесса-Родителя
        HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);  //создаю мьютекс
        _tcscpy(szCmdLine, TEXT("OS3Mutex.exe"));
        _tcscat_s(szCmdLine, MAX_PATH, TEXT(" GO "));
        sprintf(str, "%d", hMutex);
        _tcscat_s(szCmdLine, MAX_PATH, str);  //формирую парамтеры командной строки. Туда я заношу слово GO, дескриптор Мьютекса и Дескриптор Родительского процесса
        _tcscat_s(szCmdLine, MAX_PATH, TEXT(" "));
        sprintf(str, "%d", Parent);
        _tcscat_s(szCmdLine, MAX_PATH, str);
        cout << "MAIN PROGRAM";
        //массив процессов
        HANDLE* hT = new HANDLE[3];
 
        for (int i = 0; i < 3; i++)
        {
            bRet = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); //пораждаю экземпляр, передавая в него мои параметры
            hT[i] = pi.hProcess;
            CloseHandle(pi.hThread);
        }
        CloseHandle(hMutex);
        WaitForMultipleObjects(3,hT, TRUE, INFINITE);
        for (int i = 0; i < 3; i++)
            CloseHandle(hT[i]);
    }
    else if (argc == 4)
    {
        cout << argv[1] << endl;
        HANDLE THandle;
        HANDLE Parent =(HANDLE)atoi(argv[3]);
        cout << Parent << endl;
        HANDLE a = (HANDLE)atoi(argv[2]);
        cout << a << endl;
        BOOL w=DuplicateHandle(Parent, a, GetCurrentProcess(), &THandle, 0, FALSE, DUPLICATE_SAME_ACCESS);//пытаюсь сделать дубликат Мьютекса, используя передаванные параметры.
        //но тут лажа, он не делает копию.
        //if (w == FALSE) return 0;
        cout << THandle << endl;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2016, 20:22
Ответы с готовыми решениями:

Передача дескрипторов через STARTUPINFO
Как именно передавать дескрипторы через эту структуру дочерним процессам? Включаю флаг STARTF_USESTDHANDLES, присваиваю наследуемые...

Прием значений от пользователя через параметры командной строки
1. Написать программу, выполняющую следующие действия: выводит сообщение, предлагающее пользователю ввести его фамилию, табельный номер...

Как передать имя каталога через параметры командной строки?
Всех приветствую и вновь обращаюсь к вашей помощи! Текст задания сам вот какой - Вывести на экран содержимое корневого каталога....

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.11.2016, 23:01
Все верно, DuplicateHandle первым параметром требует хэндл исходного процесса.
А у тебя в коде туда передается Parent - в контексте дочернего процесса это
просто некое число, а не хэндл. Поэтому функция и не работает.

Переписать можно так: передавать в дочерний процесс не хэндл процесса, а его ID.
Тогда дочерний процесс сделает OpenProcess и после этого уже сможет делать
дубликаты хэндлов этого процесса.
0
0 / 0 / 0
Регистрация: 05.01.2015
Сообщений: 26
07.11.2016, 00:12  [ТС]
Переписал по вашему совету:
C++ (Qt)
1
DWORD Parent=GetCurrentProcessId();
- беру ID процесса и передаю его через параметр командной строки.
C++ (Qt)
1
HANDLE Parent1 = OpenProcess(PROCESS_DUP_HANDLE, 0, atoi(argv[3]));
- в дочернем процессе делаю так.
В результате DuplicateHandle все так же не работает, а GetLastError получает ошибку The handle is invalid. Может мьютекс тоже передавать по другому надо?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.11.2016, 08:31
Покажи исправленную версию кода.
0
0 / 0 / 0
Регистрация: 05.01.2015
Сообщений: 26
07.11.2016, 11:52  [ТС]
C++ (Qt)
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <windowsX.h> 
#include <process.h>
#include <Psapi.h>
#include <tchar.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, char *argv[])
{
    if (argc == 1)
    {
        STARTUPINFO si = { sizeof(STARTUPINFO) };
        ZeroMemory(&si, sizeof(STARTUPINFO));
        si.cb = sizeof(si);
        PROCESS_INFORMATION pi;
        TCHAR szCmdLine[MAX_PATH];
        TCHAR str[64];
        BOOL bRet;
        DWORD Parent=GetCurrentProcessId(); //получаю идентификатор Процесса-Родителя
        HANDLE hMutex =CreateMutex(NULL, FALSE,NULL);  //создаю мьютекс
        _tcscpy(szCmdLine, TEXT("OS3Mutex.exe"));
        _tcscat_s(szCmdLine, MAX_PATH, TEXT(" GO "));
        sprintf(str, "%d", hMutex);
        _tcscat_s(szCmdLine, MAX_PATH, str);  //формирую парамтеры командной строки. Туда я заношу слово GO, дескриптор Мьютекса и Дескриптор Родительского процесса
        _tcscat_s(szCmdLine, MAX_PATH, TEXT(" "));
        sprintf(str, "%d", Parent);
        _tcscat_s(szCmdLine, MAX_PATH, str);
        cout << "MAIN PROGRAM";
        //массив процессов
        HANDLE* hT = new HANDLE[3];
        for (int i = 0; i < 3; i++)
        {
            bRet = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); //пораждаю экземпляр, передавая в него мои параметры
            hT[i] = pi.hProcess;
            CloseHandle(pi.hThread);
        }
        CloseHandle(hMutex);
        WaitForMultipleObjects(3,hT, TRUE, INFINITE);
        for (int i = 0; i < 3; i++)
            CloseHandle(hT[i]);
    }
    else if (argc == 4)
    {
        cout << argv[1] << endl;
        HANDLE THandle = NULL;
        HANDLE Parent1 = OpenProcess(PROCESS_ALL_ACCESS|PROCESS_DUP_HANDLE, 0, atoi(argv[3]));
        cout << Parent1 << endl;
 
        HANDLE a = (HANDLE)atoi(argv[2]);
        cout << a << endl;
 
        BOOL w = DuplicateHandle(Parent1, a, GetCurrentProcess(), &THandle, 0, TRUE, DUPLICATE_SAME_ACCESS);//пытаюсь сделать дубликат Мьютекса, используя передаванные параметры.
        
        int error = GetLastError();
        cout << error << endl;
        cout << THandle << endl;
        int c = 0;
        DWORD dwResult;
        while (c<3) //работа с разделенным ресурсом
        {
            dwResult = WaitForSingleObject(THandle, INFINITE);
            if (WAIT_FAILED != dwResult)
            {
                for (int j = 1; j < 11; j++){
                    cout << ">>  " << j << endl;
                    Sleep(200);
                }
                    c++;
                    ReleaseMutex(THandle);
            }
        }
    }
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.11.2016, 11:59
Лучший ответ Сообщение было отмечено thesaratow как решение

Решение

Ну насколько я вижу, здесь в родительском процессе нельзя вызывать
CloseHandle(hMutex), пока дочерние процессы не отработают.
1
0 / 0 / 0
Регистрация: 05.01.2015
Сообщений: 26
07.11.2016, 12:01  [ТС]
Большое спасибо, все заработало!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2016, 12:01
Помогаю со студенческими работами здесь

Передача числа через аргумент командной строки
Здравствуйте. Мне необходимо передать число в программу, а затем работать с этим числом. Проблема состоит в том, что при...

Параметры командной строки
Как можно реализовать в Python если ( script -r ) чтобы он выполнил одно и если ( script -s ) другое ?

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

Параметры командной строки
ребят помогите со следующим вопросом. мне нужно при запуске ехе файла двойным щелчком(не из под командной строки!!!) получить путь к...

Параметры командной строки
В VS2008 пытаюсь вывести на печать параметры командной строки: #include &lt;tchar.h&gt; #include &lt;iostream&gt; int _tmain(int...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru