Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2008, 00:12   #1
Diman4ik
 
Регистрация: 27.01.2008
Сообщений: 5
Лампочка CreateProcess() параметры

Если не сложно или у кого-то есть что-то похожее, киньте исходник, срочно контрольную в универ нужно, а материала нет.
///////
// 1 //
///////
|
///////
// 2 //
///////
| |
\\\\\\ \\\\\\
\\3\\ \\4\\
\\\\\\\ \\\\\\
необходимо создать 4 процесса соответственно рисунку вверху и вывести их пиды и время их включения в файл. Не могу в функции CreateProcess разобраться, а точнее в её параметрах(((
Diman4ik вне форума Ответить с цитированием
Старый 28.01.2008, 00:49   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Не могу в функции CreateProcess разобраться, а точнее в её параметрах
Пример показывает как из Вашей программы запустить внешнее приложение и подождать его завершения.
Код:
function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export; 
var 
  StartInfo: TStartupInfo; 
  ProcInfo: TProcessInformation; 
  CmdLine: ShortString; 
begin 
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x } 
  CmdLine := '"' + Filename + '" ' + Params; 
  FillChar(StartInfo, SizeOf(StartInfo), #0); 
  with StartInfo do 
  begin 
    cb := SizeOf(StartInfo); 
    dwFlags := STARTF_USESHOWWINDOW; 
    wShowWindow := WinState; 
  end; 
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false, 
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, 
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo); 
  { Ожидаем завершения приложения } 
  if Result then 
  begin 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    { Free the Handles } 
    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
  end; 
end;
А вот пример вызова этой функции:
ExecAndWait( 'C:\windows\calc.exe', '', SH_SHOWNORMAL)

Думаю, теперь с параметрами станет яснее?
mihali4 вне форума Ответить с цитированием
Старый 28.01.2008, 00:54   #3
Diman4ik
 
Регистрация: 27.01.2008
Сообщений: 5
По умолчанию

это на дэлфи, а мне на С++, но тока не открыть какие-нить приложения, а создать самому дерево процессов. есть же разница. Спасибо
Diman4ik вне форума Ответить с цитированием
Старый 28.01.2008, 01:07   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
это на дэлфи, а мне на С++
Даром экстрасенса не обладаю. В правилах сказано - указывайте язык...
Цитата:
но тока не открыть какие-нить приложения, а создать самому дерево процессов. есть же разница
А я вынес в голову ответа ту часть вопроса, с которой решил вам помочь - параметры CreateProcess...
А уж с деревом как-нибудь сами...
mihali4 вне форума Ответить с цитированием
Старый 28.01.2008, 02:10   #5
Diman4ik
 
Регистрация: 27.01.2008
Сообщений: 5
По умолчанию

А как породить параллельный процесс и как последовательный при помощи функции CreateProcess?
Diman4ik вне форума Ответить с цитированием
Старый 28.01.2008, 08:43   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Diman4ik Посмотреть сообщение
А как породить параллельный процесс и как последовательный при помощи функции CreateProcess?
Что Вы понимаете под "параллельными" и "последовательными" процессами? В Windows все процессы равнозначны и их потоки выполняются параллельно. Отличаться могут права доступа (для процессов) или приоритеты выполнения (для потоков). Существует понятие "родительских" и "дочерних" процессов - кто вызвал CreateProcess, тот и родитель, но практически в Windows эта концепция используется только для передачи прав доступа к объектам, порожденным родительским процессом, и в общем случае уничтожение родительского процесса никак не сказывается на дочернем. Ваше дерево элементарно реализуется с посмощью CreateProcess, достаточно вызвать ее в процессе "1", породив процесс "2" и вызвать дважды в процессе "2", породив процессы "3" и "4", здесь порядок вызова значения не имеет, если только между процессам "3" и "4" Вы не предусматриваете какой-либо синхронизации. Функция CreateProcess - это одна из самых хорошо документированных, а если еще и дело происходит на C, то должно быть вполне достаточно документации из первоисточника: http://msdn2.microsoft.com/en-us/library/ms682425.aspx
B_N вне форума Ответить с цитированием
Старый 28.01.2008, 09:26   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как породить параллельный процесс и как последовательный при помощи функции CreateProcess?
Дык, она вроде и порождает параллельные. А последовательный... Ну подожди завершения "паралельного" и пусть это считается "иммитация" последовательности. )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.01.2008, 03:10   #8
Diman4ik
 
Регистрация: 27.01.2008
Сообщений: 5
По умолчанию

В общем вот решение, но только помогите найти ошибку... Почему "an error occured while creating process(es)" ?
Программа написана в Console applications на С++

начало:
//////////////////////////////////////////////////
Цитата:
#include <iostream.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

//функция, создающая процесс. в качестве параметров принимает номер узла в дереве процессов (nodeNumber)
//и имя файла, в который будут записываться данные о текущем времени и pid'е (fileName)
void CreateNewProcess( int nodeNumber, char *fileName )
{
//структуры, необходимые для создания процесса
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInfo;
//очищение памяти под вышеобъявленные структуры
ZeroMemory( &startupInfo, sizeof( startupInfo ) );
ZeroMemory( &processInfo, sizeof( processInfo ) );
//заполнение поля, содержащего размер структуры
startupInfo.cb = sizeof( startupInfo );

//объявление строковой переменной, в которой будет храниться значение командной строки создаваемого процесса
char processCMDLine[256];
//заполнение командной строки: новый процесс будет получать свой определенный номер, соответствующий
//узлу в дереве процессов (nodeNumber), а также имя файла для записи соответствующих данных (fileName)
sprintf( processCMDLine, "os_proc.exe %d %s", nodeNumber, fileName );

//создаем процесс со сформированной выще командной строкой (processCMDLide) и остальными параметрами,
//заданными по умолчанию/игнорируемыми/наследуемыми от родительского процесса
if ( !CreateProcess( NULL, processCMDLine, NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo ) )
//выдаем сообщение об ошибке в случае неудачи при создании процесса
cout << endl << "*****" << endl << "an error occured while creating process(es)" << endl;

//закрываем открытые дескрипторы созданного процесса (hProcess) и его главного потока (hThread)
CloseHandle( processInfo.hProcess );
CloseHandle( processInfo.hThread );
}

//функция, управляющая созданием процессов в соответствии с заданным деревом процессов. в качестве параметров
//принимает текущий номер узла в дереве процессов (nodeNumber) и имя файла, в который будут записываться
//необходимые данные (fileName)
void ManageNodes( int nodeNumber, char *fileName )
{
//объявляем дескриптор файла для последующего его открытия и записи данных
FILE *outFile;

//объявляем переменную для хранения данных о системном времени
SYSTEMTIME currentTime;
//заполняем поля переменной текущими значениями системного времени
GetSystemTime( &currentTime );

//выводим на экран данные: текущий номер узла в дереве процессов (nodeNumber), PID текщего процесса,
//данные о текущем времени (currentTime)
cout << "current node number = " << nodeNumber << endl;
cout << "\ncurrent process PID = " << GetCurrentProcessId() << endl;
cout << "current time (UTC) = " << currentTime.wHour << ":" << currentTime.wMinute << ":" << currentTime.wSecond << endl;

//открываем файл для записи вышеприведенных данных о процессе
outFile = fopen( fileName, "a+" );
//записываем данные в файл
fprintf( outFile, "node = %d\npid = %d\ntime = %d:%d:%d\n\n", nodeNumber, GetCurrentProcessId(), currentTime.wHour, currentTime.wMinute, currentTime.wSecond );
//закрываем файл
fclose( outFile );

//выбираем действие в зависимости от текущего номера узла в дереве процессов: создаем дочерние процессы
//либо не производим никаких действий
switch ( nodeNumber )
{
//первый узел. в соответствии с деревом создаем второй, третий и пятый узлы
case 1:
CreateNewProcess( 2, fileName );
CreateNewProcess( 3, fileName );
CreateNewProcess( 5, fileName );
break;
case 2:
//второй узел. в соответствии с деревом создаем четвертый узел
CreateNewProcess( 4, fileName );
break;
//четвертый узел. в соответствии с деревом создаем шестой узел
case 4:
CreateNewProcess( 6, fileName );
break;
case 6:
//шестой узел. в соответствии с деревом создаем седьмой, восьмой и девятый узлы
CreateNewProcess( 7, fileName );
CreateNewProcess( 8, fileName );
CreateNewProcess( 9, fileName );

break;
//в остальных случаях не производим никаких действий
default:
break;
}
}

//главная функция. в качестве параметров в нее передается количество аргументов командной строки (argc)
//и массив самих аргументов (argv), в котором будут находится текущий номер узла и имя файла для записи
//данных (argv - командная строка, формируется при создании процесса в вышеописанной функции CreateNewProcess)
////////////////////////////////////
продолжение - след. цитата
Diman4ik вне форума Ответить с цитированием
Старый 30.01.2008, 03:11   #9
Diman4ik
 
Регистрация: 27.01.2008
Сообщений: 5
По умолчанию

продолжение:

///////////////////////////


Цитата:
void main( int argc, char **argv )
{
//объявляем дескриптор файла для его создания
FILE *outFile;
//объявляем переменную для хранения имени файла
char fileName[256];

//объявляем переменную для хранения номера текущего узла. по умолчанию это самый первый узел
int nodeNumber = 1;

//если количество аргументов командной строки больше одного, то это значит, что мы находимся
//в процессе, созданном в функции CreateNewProcess
if ( argc > 1 )
{
//считываем из коммандной строки номер текущего узла (второй аргумент командной строки (argv[1])),
//так как первый аргумент (argv[0]) содержит имя запускаемого модуля (в нашем случае это "os_proc.exe")
nodeNumber = atoi( argv[1] );
//копируем в соответстующую переменную имя файла для записи данных, которое является третьим аргументом
//в командной строке (argv[2])
strcpy( fileName, argv[2] );
}
//в противном случае текущий процесс является самым первым, запущенным пользователем
else
{
//запрашиваем имя файла для записи данных
cout << "enter out file name: ";
cin >> fileName;

//создаем (либо очищаем существующий) файл путем его открытия и последующего закрытия
outFile = fopen( fileName, "w" );
fclose( outFile );
}

//запускаем функцию распределения процессов в соответствии с деревом процессов
ManageNodes( nodeNumber, fileName );
getch();
}
///////////////////////////////////////////////////////
конец.

собираюсь сдаваться но вот тока эта ошибка, а вроде всё правильно

Последний раз редактировалось Diman4ik; 30.01.2008 в 03:12. Причина: неправильно теги quote поставил
Diman4ik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметры копирования Черничный Общие вопросы Delphi 4 14.08.2008 10:57
С# - параметры функции ameli Общие вопросы .NET 4 02.06.2008 16:40
msiexec - параметры ERASERROR Софт 0 21.02.2008 14:38
CreateProcess (Delphi 7) Alex.rus Помощь студентам 1 06.12.2007 20:12