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

Взаимодействие процессов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++/CLI WinForms Управление другой программой http://www.cyberforum.ru/cpp-beginners/thread345093.html
Подскажите инклуды\библиотеки для управления другими програмамми а что хочу делать шас напишу Я собераюсь внедрится в прогу клиент где имеется писок игровых серверов. мне надо получить ип выбраного сервера и управлять buttom'ami этой программы а тоесть дисаблить кнопку и кликать кнопку подключения к серверу подскажите какие библиотеки использовать а также желательно сылки на примеры
C++ Среда разработки на Symbian 9.1 Доброго времени суток. У меня есть старый Nokia E61(qwerty с Os 9.1). Так вот, суть: Я хочу заниматься кодингом когда PC не рядом. Есть ли под среды symbian? (С++) КОМПИЛЯЦИЯ НЕ ОБЯЗАТЕЛЬНА, главное автосблюдение tab/white spaces. И выделение операторов соответствующим цветом. http://www.cyberforum.ru/cpp-beginners/thread345087.html
НОК для N чисел C++
//--------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> //--------------------------------------------------------------------------- int Nok(int *mass, short N, int m) { short kol = N;
C++ Принятие русского шрифта в консоли
Здрасте! Я написал програму, которая должна использовать русский шрифт, но она его не распознает. Для того, что бы она отображала русский текст, я добавил команду setlocale( LC_ALL,"Russian" ); но программа не способна воспринимать кирилицу, то есть если запустить такую программу: ... cout << "введите ваше имя: "; char name; cin.getline(name, 20); cout << "Вас зовут: " << name; ..
C++ Переменные среды Windows http://www.cyberforum.ru/cpp-beginners/thread345058.html
Как в c++ использовать переменные среды windows? Например я хочу открыть текстовый файл в каталоге C:\documents and settings\user\1.txt Переменная среда данного каталога выглядит вот так: %USERPROFILE% Пример: fp1 = fopen("C:\\documents and settings\\user\\1.txt","rb"); Как вместо полного пути к файлу использовать переменную среду windows?
C++ Набор для программирования Доброе время суток. Я хочу написать программу на С++. И затем продать ее. У меня нет денег покупать IDE,потому хочу отдельно взять компилятор, отдельно набор классов для GUI и т.д. Подскажите, что именно можно использовать? И что удобнее изучать. подробнее

Показать сообщение отдельно
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
30.08.2011, 15:33     Взаимодействие процессов
Тогда вас могут заинтересовать следующие функции WinAPI:

ShellExecute
CreateProcess
WaitForMultipleObjects

Есть P1 и Pn представлены одним исполняемым файлом, то Pn можно сказать, что он не хостовый процесс (не P1) либо через параметр коммандной строки, либо создав у P1 сервер TCP (на localhost) или DDE, а у Pn пробовать подключаться к этому серверу. Если подключение удачное - то мы Pn, если неудачное - то мы P1.

Ещё вариант: lock-файл. Создаёте пустой файл с определённым именем (как вариант, ProcessSpawner_LockFile) при запуске P1. Если Pn файл существует, то хостовый процесс запущен, и мы - дочерний процесс. Если файл не существует, то мы - хостовый процесс, мы должны создать этот файл и дочерние процессы. При выходе P1 удаляет lock_файл.

Добавлено через 2 часа 4 минуты
Я представляю себе это так:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <windows.h>
 
#define MAX_PROCESSES 9
 
const char * lockFileName = "ProcessSpawner_LockFile";
char * myName;
char stop = 0;
 
void parent();
void child();
unsigned startSelf( );
 
HANDLE fd;
 
int main( int argc, char ** argv )
{
    myName = argv[0];
 
    fd = CreateFile( lockFileName, GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
 
    if( fd != INVALID_HANDLE_VALUE )
       parent();
    else
       child();
 
    return 0;
}
 
/* обработчик закрытия окна консоли, Ctrl+C, Ctrl+Break и т.д. 
   также вызывается для закрытия и удаления lock-файла в случае ошибки */
BOOL sig( DWORD sig )
{
    stop = 1;
 
    CloseHandle( fd );
 
    if( 0 == DeleteFile( lockFileName ) )
        fprintf( stderr, "\nCould not delete the lock file: 0x%x", GetLastError() );
 
    puts( "\nExiting. Please wait..." );
 
    return 1;
}
 
/* основной код родительского процесса */
inline void parent()
{
    puts( "============ PARENT MODE ==============" );
 
    if( !SetConsoleCtrlHandler( sig, 1 ) )
    {
        fprintf( stderr, "Could not set console control handler: 0x%x\n", GetLastError() );
 
        sig( 0 );
        return;
    }
 
    unsigned int restarts[ MAX_PROCESSES ] = {0};
    HINSTANCE proc[ MAX_PROCESSES ];
    unsigned short count = 0;
    char error = 0;
 
    while( count < MAX_PROCESSES )
    {
        proc[count] = startSelf( );
 
        if( proc[count] < 0x20 )
        {
           stop++;
           sig( 0 );
           return;
        }
 
        count++;
    }
 
    while( !stop )
    {
        unsigned i = 0;
 
        putchar( '\r' );
        while( i < MAX_PROCESSES )
        {
            printf( "[%d] ", restarts[i++] );
        }
 
        unsigned result = WaitForMultipleObjects( MAX_PROCESSES, &proc, 0, INFINITY );
 
        if( stop )
           break;
 
        if( result == WAIT_FAILED )
        {
            fprintf( stderr, "\nError while waiting for a process to terminate: 0x%x\n", GetLastError() );
            break;
        }
 
        result -= WAIT_OBJECT_0;
 
        if( result >= MAX_PROCESSES )
        {
            fprintf( stderr, "\nFailed to recreate a child process: 0x%x\n", GetLastError() );
            break;
        }
 
        proc[result] = startSelf( );
        restarts[result]++;
 
        if( proc[result] < 0x20 )
        {
           fprintf( stderr, "\nFailed to recreate a child process: 0x%x\n", GetLastError() );
           break;
        }
    }
 
    if( !stop )
       sig( 0 );
}
 
/* запускает дочерний процесс, открывает его ID с правами на синхронизацию */
unsigned startSelf( )
{
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION procInfo;
 
    memset( &startupInfo, 0, sizeof( startupInfo ) );
    startupInfo.cb = sizeof( startupInfo );
 
    char result = CreateProcess( myName, 0,
                                0, 0,
                                0,
                                CREATE_NEW_CONSOLE, 0, 0, &startupInfo, &procInfo );
 
    if( !result )
    {
        fprintf( stderr, "Could not create a child process: 0x%x\n", GetLastError() );
        return 0;
    }
 
    return OpenProcess( SYNCHRONIZE, 0, procInfo.dwProcessId );
}
 
/* основной код дочернего процесса */
inline void child()
{
    /* дочерние процессы запускаются одновременно,
       по-этому seed от time - не самый лучший вариант.
       от GetCurrentProcess тоже не работает.
       есть идеи? */
    srand( time(0) );
    unsigned w = rand() % 8 + 2;
 
    printf( "Child mode. Waiting for %i seconds\n", w );
 
    Sleep( w * 1000 );
 
    puts( "Bye." );
 
    return;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru