Запуск приложений через cmd.exe

Тема в разделе "WASM.WIN32", создана пользователем was_log_a, 15 авг 2005.

  1. was_log_a

    was_log_a New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    97
    Запускаю я cmd.exe с перенаправленным вводом\выводом.

    Потом запускаю через него какое-нибудь оконное приложение,а оно появляется на десктопе не сразу,а после того как запущу еще другое приложение (которое аналогично не появляется).В чем причина и что делать?
     
  2. ash

    ash New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2004
    Сообщения:
    52
    Адрес:
    Latvia
    Не в буферизации ли дело?

    Смотри fflush, setbuf
     
  3. was_log_a

    was_log_a New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    97
    Нет,не в буферизации.Когда я запускаю приложение,оно появляется в списке процессов,но на десктопе только после запуска следующего
     
  4. ash

    ash New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2004
    Сообщения:
    52
    Адрес:
    Latvia
    А код секретный? Или можешь выложить?
     
  5. was_log_a

    was_log_a New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    97
    вот код запуска cmd.exe


    Код (Text):
    1.  
    2. sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    3. sa.lpSecurityDescriptor=NULL;
    4. sa.bInheritHandle=TRUE;
    5.  
    6.  
    7.  
    8. CreatePipe(&clients[index].s_read,&clients[index].cli_out,&sa,NULL);
    9. CreatePipe(&clients[index].cli_in,&clients[index].s_write,&sa,NULL);
    10.  
    11. DuplicateHandle(GetCurrentProcess(),clients[index].s_read,GetCurrentPr ocess(),&temp_handle,0,FALSE, DUPLICATE_SAME_ACCESS);
    12. CloseHandle(clients[index].s_read);
    13. clients[index].s_read=temp_handle;
    14.  
    15. DuplicateHandle(GetCurrentProcess(),clients[index].s_write,GetCurrentP rocess(),&temp_handle,0,FALSE, DUPLICATE_SAME_ACCESS);
    16. CloseHandle(clients[index].s_write);
    17. clients[index].s_write=temp_handle;
    18.  
    19. temp_handle=0;
    20.  
    21. si.cb          = sizeof( STARTUPINFO );
    22.  si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    23.  si.wShowWindow = SW_HIDE;
    24. si.lpTitle=NULL;
    25. si.hStdInput=clients[index].cli_in;
    26. si.hStdOutput=clients[index].cli_out;
    27. si.hStdError=clients[index].cli_out;
    28.  
    29.  
    30.  
    31.  
    32.  
    33. if (!CreateProcess( NULL,"cmd", NULL,NULL, TRUE, 0, NULL, NULL, &si, &pi ))
    34. {
    35. sp_data_cliout(index,"Error starting cmd.exe\n",24);
    36. }
    37. else
    38. {
    39. clients[index].cmd_ph=pi.hProcess;
    40. clients[index].cli=true;
    41. clients[index].thread=CreateThread(NULL,512,PipeReadThreadProc,(LPVOID)(DWORD)index,0,NULL);
    42. }
     
  6. ash

    ash New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2004
    Сообщения:
    52
    Адрес:
    Latvia
    Да, поведение действительно загадочное. Могу предложить workaround - запускать так:
    Код (Text):
    1. start regedit.exe
     
  7. was_log_a

    was_log_a New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    97
    Таким способом запускается нормально.В чём может быть разница?
     
  8. ash

    ash New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2004
    Сообщения:
    52
    Адрес:
    Latvia
    Разнциа в том, что команда start запускает новую консоль и уже из неё - требуемую программу.
     
  9. was_log_a

    was_log_a New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    97
    Хочется,чтоб обычным способом тоже запускалось