На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Ожидание завершения программы
    Задача такая: запустить другое приложение и дождаться его завершения.
    Подозреваю, что подобные вопросы задаются очень часто :) Но всё же.

    Ознакомившись с ФАКом и поискав в интернете, увидел, что большинство методов заключается в использовании функции CreateProcess, через которую мы получаем handle созданного процесса, а потом уже используем WaitForSingleObject.
    Мне необходимо, чтобы запущенное приложение не показывалось. В функциях WinExec и ShellExecute есть специальные параметры, куда пишешь к примеру SW_HIDE. У CreateProcess я такого не нашёл.
    В общем нужно дождаться завершения другой программы, которая в процессе работы не должна показываться.
    Как так сделать?
      в недра параметра StartupInfo загляни
        Заглянул.
        Сделал вот так перед вызовом CreateProcess:
        ExpandedWrap disabled
          var
            si : TStartupInfo;
            ...
          begin
             ...
             si.wShowWindow:=SW_HIDE;
             ...

        Всё равно вызываемое приложение мелькает.
          А флаги кто будет ставить?
            Цитата CodeMonkey @
            А флаги кто будет ставить?

            А это как? Поясните пожалуйста :unsure:
              Покажи полностью код
                  Цитата hanky @
                  Сделал вот так перед вызовом CreateProcess:

                  Цитата hanky @
                  Всё равно вызываемое приложение мелькает.

                  Цитата CodeMonkey @
                  А флаги кто будет ставить?

                  Цитата hanky @
                  А это как? Поясните пожалуйста

                  Цитата
                  wShowWindow
                  Игнорируется, кроме тех случаев, когда dwFlags содержит флаг STARTF_USESHOWWINDOW. wShowWindow может быть равен любой из констант вида SW_константа определённых в WINUSER.H. Для GUI-процессов wShowWindow задаёт значение по умолчанию первого вызова функции ShowWindow. Параметр функции ShowWindow nCmdShow игнорируется. В последующих вызовах функции ShowWindow, член wShowWindow используется, если параметр функции ShowWindow nCmdShow установлен в SW_SHOWDEFAULT
                  :D
                    P.O.D, medved_68, спасибо, приму к сведению.

                    Ещё есть такой вопрос.
                    Мне необходимо прикрутить сторонню программу. Запускается она через .bat файл. То есть, если в батнике написано "Name.exe", то результаты выводятся на экран, если "Name.exe> log.txt" - то в файл.
                    При попытке запустить батник через WinExec или ShellExecute выдаётся сообщение, что файл Name.exe не найден.
                    Как быть?
                      Установить нужный рабочий каталог.
                      Цитата
                      HINSTANCE ShellExecute(
                      HWND hwnd,
                      LPCTSTR lpOperation,
                      LPCTSTR lpFile,
                      LPCTSTR lpParameters,
                      LPCTSTR lpDirectory,
                      INT nShowCmd
                      );
                        Цитата hanky @
                        При попытке запустить батник через WinExec или ShellExecute выдаётся сообщение, что файл Name.exe не найден.

                        Как вариант - передай в ShellExecute полный путь до файла Name.exe :D
                          arj99, заработало. Спасибо.

                          Цитата medved_68 @
                          Как вариант - передай в ShellExecute полный путь до файла Name.exe
                          medved_68, не, так не пойдёт. Прога работает так, что её надо вызывать обязательно через .bat файл.

                          В общем вопрос, я думаю, решён.
                          Всем спасибо.
                          Сообщение отредактировано: hanky -
                            Цитата hanky @
                            ... так не пойдёт. Прога работает так, что её надо вызывать обязательно через .bat файл ...

                            и в чем проблема передавать полный путь преобразованный функцией ShortFileName ....

                            функция может быть такой ...

                            ExpandedWrap disabled
                              function ShortFileName(const FileName: string): string;
                              var
                                aTmp: array[0..255] of Char;
                              begin
                               if GetShortPathName(PChar(FileName), aTmp, Sizeof(aTmp)) = 0 then begin
                                    Result:= FileName;
                                 end
                                 else begin
                                    Result:= StrPas (aTmp);
                                 end;
                              end;

                            после получения "короткого имени" переводим его в кодировку CP-866 записываем в файл и можно работать ....
                            Сообщение отредактировано: andrew.virus -
                              andrew.virus, что такое "короткое имя"? И как это может помочь запустить прогу через .bat файл, который я запускаю из своей программы?
                                Цитата hanky @
                                что такое "короткое имя"? И как это может помочь запустить прогу через .bat файл, который я запускаю из своей программы?

                                как пример нужно передать в файл путь ...

                                ExpandedWrap disabled
                                    D:\Мои документы\Санитарные_правила_и_нормы\СанПиН-2_2_4_1294-03.2003-06-15\СанПиН-2_2_4_1294-03-20030615.htm

                                после обработки получаем такой путь ...

                                ExpandedWrap disabled
                                    D:\МОИДОК~1\САНИТА~1\САНПИН~2.200\САНПИН~1.HTM

                                такое бывает нужно, поскольку bat-файл работает в режиме эмуляции MS-DOS и требователен к именам файлов, например, программы не могут принимать пути к файлам в имени которых есть пробелы (имеются ввиду полные имена) в этом случае и удобны "короткие имена" файлов ...
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0498 ]   [ 15 queries used ]   [ Generated: 19.05.24, 22:04 GMT ]