_nic Мда... код на редкость бредовый. Во-первых, Вы проверяете существование не запустившего процесса, а запущенного. Во-вторых, Вы передаёте отфанарный указатель на скорее всего несуществующую область памяти. Везёт ещё, что GetExitCodeProcess процесс не валит. В-третьих, Вы проверяете равенство этого отфанарного указателя значению STILL_ACTIVE. В общем случае равенство будет достигаться с вероятностью один к четырём миллиардам. Поэтому и вылетает MessageBox.
Ошибка вылазит но процесс не валится ЗЫ:я хочу что бы копии дург друга мониторили.А почему указатель "отфанарный" его же вроде как CreateProcess возвращает в структуре?
_nic Всё сообщение цитировать не надо было. Я говорил об указателе, а не о хэндле. CreateProcess возвращает хэндл дочернего процесса в структуре. А указатель - это code, который ничем не инициализирован (о чём, я думаю, компилятор си предупреждает). Правильно было бы создавать переменную типа DWORD code. И вызывать так: GetExitCodeProcess(pi.hProcess,&code). А вот это: "code!=(unsigned long*)STILL_ACTIVE", — называется наглым затыканием рта компилятору. Никаких приведений типов здесь не надо. Вообще "друг друга" и "родительская копия" - это немного разные вещи. Для "друг друга", наверное, больше подойдёт вариант из поста 3 и эвентуально вспомогательный поток. Хотя подходят все варианты. Можно даже пайп между процессами сделать. Обрыв пайпа означал бы, что один из процессов мёртв. Для вариантов с GetExitCodeProcess/WaitForSingleObject (проверка существования родительского процесса), как я написал в посте 4, нужно "дать дочернему процессу унаследовать свой хэндл". А также, разумеется, передать значение этого хэндла дочернему процессу.
_nic Это поле не PEB, а PROCESS_BASIC_INFORMATION. Ни та, ни та структура полностью официально не документирована. Пользуемся Windows NT 2000 Native API reference (Gary Nebbett).
Существует в природе заголовочный файл с этими обьявленными структурами? ЗЫ:ну немогу никак понять смысла с мютексом ,код в том примере для меня абсолютно неясен, ассемблер для меня темный лес
_nic Хватит цитировать сообщения целиком. По вопросу не знаю (скорее всего да). Я при необходимости беру из вышеупомянутой книжки или из сети. Единственный совет - медитировать до полного просветления, как бы банально это не звучало. Мозг при этом автоматически увеличивает размер доступной кэш-памяти, а также создаст дополнительные ассоциативные связи, что позволит решать более сложные задачи в будущем. P.S. Чуть не забыл... на всякий случай специально для Clerk: нет, я не под ПАВ.
Мда ну что я виноват что предпочитаю асму С?Ну создал я мьютекс ,точно с таким же lpName не создать 2й мьютекс.Ну и что мне с первым то делать?Пытатся в цикле создавать пока CreateMutex не престанет возвращять ERROR_ALREADY_EXISTS ? А причем тогда WaitForSingleObject?
Здесь дело не в асме или си. Дело в MSDN. Смотрим WaitForSingleObject: Процесс пытается создать Mutex. Если Mutex с этим именем уже создан, то он просто получит хэндл к существующему Mutex'у, но не получит права владения Mutex'ом. После этого процесс вызывает WaitForSingleObject, который не вернёт управление, пока поток-владелец не потеряет права владения Mutex'ом (WAIT_ABANDONED в случае завершения потока). Помимо возврата управления WaitForSingleObject также передаст права владения вызвавшему её потоку. Т.о. дочерний процесс будет знать, что родительский завершён, когда WaitForSingleObject вернёт управление. P.S. Учимсо учиццо.
ВОт что у меня вконце концов вышло Код (Text): TForm1 *Form1; PROCESS_INFORMATION pi; STARTUPINFO si; void thr(void *Pvoid) { char fnm[400]; DWORD code; for(;;) { Sleep(300); GetExitCodeProcess(pi.hProcess,&code); if(code!=STILL_ACTIVE) { MessageBox(0,"!!!","!!!!",MB_OK); GetModuleFileName(NULL,fnm,400); memset((void*)&pi,NULL,sizeof(pi)); memset((void*)&si,NULL,sizeof(si)); CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); memset(fnm,NULL,400); } } } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { char fnm[400]; GetModuleFileName(NULL,fnm,400); si.cb=sizeof(si); si.lpReserved=NULL; si.lpDesktop=NULL; si.lpTitle=NULL, si.dwFlags=STARTF_FORCEONFEEDBACK; si.cbReserved2=0; si.lpReserved2=NULL; HANDLE mut=CreateMutex(0,1,"emokillll"); WaitForSingleObject(mut,-1); CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_ CONSOLE,NULL,NULL,&si,&pi); _beginthread(thr,0,0); } Коряво конечно ,но вроде работает так как мне надо.Всем спасибо за помощь.