Проблема с запуском bat-скриптов через CreateProcess

Тема в разделе "WASM.BEGINNERS", создана пользователем deathwisher, 2 сен 2006.

  1. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Пытаюсь добавить в свою программу функцию самоудаления, используя скрипт для cmd.exe,
    однако через CreateProcess запустить его не удается

    вот как пытаюсь это сделать:

    PROCESS_INFORMATION pinfo;
    STARTUPINFO sinfo;

    memset(&sinfo, 0, sizeof(STARTUPINFO));
    sinfo.cb = sizeof(sinfo);
    sinfo.wShowWindow = SW_HIDE;

    CreateProcess(NULL, "c:\\windows\\system32\\cmd.exe /c c:\\r.bat", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo);

    способ работает для всех программ, а вот с cmd.exe ничего не получается.
    В чем может быть дело?
     
  2. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    deathwisher

    Зачем мучать CreateProcess, когда можно использовать ShellExecute?
     
  3. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Спасибо, уже сам решил проблему, программа не работала из-за флага DETACHED_PROCESS
    Встречный вопрос:
    а как скрыть оконное приложение

    пробую:
    PROCESS_INFORMATION pinfo;
    STARTUPINFO sinfo;

    memset(&sinfo, 0, sizeof(STARTUPINFO));
    sinfo.cb = sizeof(sinfo);
    sinfo.wShowWindow = SW_HIDE;


    CreateProcess(NULL, "c:\\windows\\system32\\notepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);

    Окно все равно появляется
     
  4. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    deathwisher

    Если сильно нужно через CreateProcess, могу поковыряться в памяти, но я всегда использовал ShellExecute. Вот как это выглядит:
    ShellExecute(NULL,NULL,"c:\\windows\\system32\\notepad.exe",NULL,NULL,SW_HIDE);
     
  5. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    не на всех экзешниках работает
     
  6. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Потому что наличие SW_HIDE в параметрах еще не означает, что окно будет скрыто при запуске. Используй ShowWindow
     
  7. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    Но тогда возможно что при запуске окно будет короткое время отображаться
     
  8. SiruS

    SiruS Алекс

    Публикаций:
    0
    Регистрация:
    19 фев 2005
    Сообщения:
    145
    Адрес:
    Львов
    rmn

    Я вот немогу скрыть свое окно с помощью ShowWindow при прохождении WM_INITDIALOG и как мне быть?
    ____________________________________________________

    Пардон, кому интересно, окно можно скрыть с помощью ShowWindowAsync.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. case WM_PAINT:
    2.     if (flag == FALSE)
    3.     {
    4.         ShowWindow(hwnd, SW_HIDE);
    5.         flag = TRUE;
    6.     }
    7.     return TRUE;
    8. case WM_CLOSE:
    9. ............
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    deathwisher
    как скрыть оконное приложение
    Помимо STARTUPINFO.wShowWindow = SW_HIDE; необходимо STARTUPINFO.dwFlags = STARTF_USESHOWWINDOW;. Для console app это сработает, для gui гарантии нет, т.к. не каждое (зависит от разработчика) приложение пользуется этой информацией равно как и параметром nCmdShow.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    q_q
    Этот параметр берётся как раз из STARTUPINFO.wShowWindow.
     
  12. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    но тот факт будут его учитывать или нет зависит от того установлен ли соотв бит в dwFlags
     
  13. deathwisher

    deathwisher New Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    36
    В общем касательно вопроса как я понял мораль такова - гарантированное скрытие окна может обеспечить только нахождение его хэндла, и затем вызов ShowWindow.
    Но тогда есть вероятность, что окно некоторое время после запуска программы будет видно, т.е. "мигнет", а этого хотелось бы избежать.
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Quantum
    берётся как раз из STARTUPINFO.wShowWindow
    В теории да. На практике - зависит от "стартап-кода". Например, в подавляющем числе примеров icztutes используется nCmdShow равное SW_SHOWDEFAULT, а в ShowWindow передается SW_SHOWNORMAL.
     
  15. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Можно пытаться открывать программу в другой WindowStation или на другом DeskTopе
     
  16. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Как говорится, способов куча. Выбор же зависит только от степени вашей извращенности. Можно придавать окну отрицательные координаты к примеру. А можно пропатчить ф-цию ShowWindow для указанного приложения и заставить ее всегда скрывать требуемое окно.
    Но это уже из области API Hooking, а новичку такое - убицца веником(сам знаю!). Ну если уж так невтерпеж - читаем маны на этом прекрасном сайте: помогут - 100%