На главную Наши проекты:
Журнал   ·   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_
  
> ShellExecute , Подкажите аналог...
    Добрый день. Знаю, что в С++ есть такая функция ShellExecute. А каков ее аналог в Дельфи? Прбовал искать с справке - там только ее описание (без синтаксика и примаров). Если такая же функция есть и в Дельфи (т.е также называется), то что надо добавлять в раздел USES?

    P.S. Подскажите ссылку на онлайн справку по программированию (Дельфи, Си++). ;)
      Эта функция не относится к встроенным в Delphi.
      Ищи в Delphi Help-->Windows SDK

      Добавлено
      Или набери в редакторе Delphi ShellExecute, затем на этой функции - F1
        Цитата Демо @
        Эта функция не относится к встроенным в Delphi.
        Ищи в Delphi Help-->Windows SDK

        Добавлено
        Или набери в редакторе Delphi ShellExecute, затем на этой функции - F1

        СПС :D
          Цитата MasterJedi @
          что надо добавлять в раздел USES?

          ShellAPI

          Цитата MasterJedi @
          Прбовал искать с справке - там только ее описание (без синтаксика и примаров).

          много примеров в DRKB

          Взято из DRKB

          Процессы, потоки и функции ShellExecute и WinExec
          Цитата

          Устройство Windows. Процессы, потоки и функции ShellExecute и WinExec. Часть 1.
          По просьбам общественности и была написана эта статья.
          Действительно невозможно профессионально разрабатывать многопоточные программы,
          не зная, что такое процессы, потоки, нити и синхронизация (надеюсь посвятить этому одну из следующих статей) и,
          не представляя, как они работают. В статье за основу взята операционная система Windows 2000.
          Так же в этой статье будут подробно рассмотрены различные методы запуска новых процессов (программ).
          Главным обстоятельством является то, что почти все современные ОС многозадачны.
          ОС Windows 2000 не является исключением, в ней может работать одновременно несколько программ.
          Любая программы имеет, по крайней мере, одним программным потоком,
          который в свою очередь может создавать еще несколько потоков и т.д.
          Но, не смотря на то, что ОС, называется "многозадачной" в конкретный момент времени
          выполняется только один поток. что вы не замечаете, как ОС переключается между потоками.
          Не стоит забывать, что, распределяя процессорное время, операционная система Windows,
          имеет дело именно с потоками, а не с процессами, которым эти потоки принадлежат.
          Запуская программу в Windows, вы создаете процесс.
          И в этом нет ничего удивительного, потому что в других операционных системах происходит почти то же самое.
          Однако все же процесс в Windows, например, отличается от процесса в Unix.
          А все дело в том, что в Windows процесс владеет открытыми файлами, оперативной памятью и другими ресурсами.
          Для каждого процесса (программы) Windows выделяет виртуальное адресное пространство объемом 2 Гб.
          Для адресации этого пространства используются обычные 32-битные указатели,
          которые представляют собой числа от 0 до 2 Г. Но процесс в Windows не исполняется.
          Исполняется программный поток. Поток - это последовательность машинных команд, которые Windows
          воспринимает, как единое целое (набор регистров процессора).
          Поток обладает указателем на команду, которая в данный момент выполняется,
          и указателем на стек где хранятся локальные переменные потока.
          Так в чем же разница спросите вы, между процессом и потоком, если запущенная программа имеет только один,
          программный поток то разницы практически никакой. Однако поток может создавать другие потоки.
          А те потоки могут создавать еще потоки. Два процесса ни могут иметь общие ресурсы,
          если не используют специальные механизмы межпроцессорного взаимодействия.
          В противоположность этому все потоки, которые принадлежат одному процессу,
          имею доступ ко всем ресурсам этого процесса.
          Зачем процессу несколько потоков? Потоки могут выполнять какие-то действия параллельно
          основной программе (в фоновом режиме). Потоки удобно применять, если нежелательна
          блокировка основной программы определенной функцией. Например, в то время, как поток
          осуществляет сложные математические вычисления, в главной программе происходит подготовка
          следующего задания и ввод параметров.
          Если вам нужно запустить новую программу, вам нужно создать новый процесс.
          Для этой цели служит системный вызов CreateProcess.
          Однако использование этого вызова не очень удобно, потому что приходится задавать множество аргументов,
          однако в некоторых случаях без него не обойтись.
          Если же вам надо просто запустить программу или открыть файл,
          то для этого подходят мене сложные вызовы.
          Легче всего использовать WinExec. Однако Microsoft не рекомендует его использование,
          а предлагает пользоваться CreateProcess.
          Но для выполнения тех или иных задач он вполне подходит.
          Почему же нежелателен вызов WinExec дело все в том, что фактически он содержит обращение
          к еще одному устаревшему системному вызову LoadModule, который обращается к CreateProcess
          со значениями аргументов по умолчанию. При обращении к WinExec необходимо задать полный путь
          к программе или имя EXE файла, расположенного в пути поиска, а также способ
          отображения программы (константы SW_HIDE, SW_SHOW и т.д. см. Таблица 2).
          Если вызов функции произошел успешно, то WinExec вернет дескриптор новой
          программы (который не может быть меньше 32, т.е. если WinExec возвращает число меньше 32,
          то вызов привел к ошибке, коды ошибок см. Таблица 1).
          Таблица 1.

          0 Системе не хватает ресурсов.
          ERROR_BAD_FORMAT Некорректный EXE файл (не Win32 EXE файл или EXE файл поврежден).
          ERROR_FILE_NOT_FOUND Указанный файл не найден.
          ERROR_PATH_NOT_FOUND Указанный путь не найден.



          Еще один простой вызов это - ShellExecute. Этот вызов во многом напоминает WinExec,
          однако он поддерживает обработку типов файлов, зарегистрированных в Windows.
          Например, если вы с помощью ShellExecute вы попробуете запустить файл с расширением .BMP,
          то буде запущена программа Paint или любая другая, которая использует для просмотра графических файлов.
          В качестве аргументов ShellExecute принимает дескриптор окна (если есть необходимость в сообщениях об ошибках),
          строку, такую как open (открыть), print (напечатать) и explore (исследовать), можно в качестве этой строки передать NULL,
          тогда файл указанный вами будет открыт (open). Так же ShellExecute необходимо сообщить имя файла и любые параметры
          командной строки (чаще всего NULL), и оставшиеся два аргумента это текущий каталог и константа функции
          ShowWindow (как и в WinExec см. Таблица 2).
          Таблица 2.

          SW_HIDE Окно в скрытом режиме.
          SW_MAXIMIZE Окно максимального размера
          SW_MINIMIZE Окно находится в свернутом виде, активируется следующее верхнее окно в Z последовательности.
          SW_RESTORE Активирует и показывает окно. Если окно свернуто или развернуто, Windows восстанавливает его
          к первоначальному размеру и позиции. Приложение должно определить этот флаг при восстановлении свернутого окна.
          SW_SHOW Активирует окно и выводит его в текущих размерах и позиции.
          SW_SHOWMAXIMIZED Активирует и показывает окно в развернутом виде.
          SW_SHOWMINIMIZED Активирует и показывает окно в свернутом виде.
          SW_SHOWMINNOACTIVE Отображает окно в свернутом виде. Активное окно остается активным.
          SW_SHOWNA Отображает окно в текущем состоянии. Активное окно остается активным.
          SW_SHOWNORMAL Активирует и показывает окно. Если окно свернуто или развернуто,
          Windows восстанавливает его к первоначальному размеру и позиции.
          Приложение должно определить этот флаг при показе окна в первый раз.



          Значение, которое возвращает ShellExecute такое же, как и у WinExec. Функцию ShellExecute можно использовать,
          например, для открытия корневого каталога диска С:

          ShellExecute(hWnd, 'open', 'c:\', nil, nil, SW_SHOWNORMAL);
          Вы можете заменить строку "open" на "explore" и в качестве третьего параметра указать любой каталог,
          в этом случае указанная вами папка откроется в Проводнике (Explorer).
          Так же существует системный вызов ShellExecuteEx, который фактически является полным аналогом
          ShellExecute, однако в качестве аргумента он принимает указатель на структуру, поля которой во многом
          совпадают с аргументами ShellExecute. Кроме этого после завершения своей работы ShellExecuteEx помещает
          в одно из полей этой структуры дескриптор запущенной программы.
          Применение этих вызовов довольно просто. Пример программы использующей WinExec и ShellExecute
          приведен в листинге 1.

          Листинг 1.
          ExpandedWrap disabled
            uses ShellAPI;
            var
              h: hwnd;
            begin
            // Используем ShellExecute
              if ShellExecute(h, 'open', 'readme.txt', nil, nil, SW_SHOW) < 32 then
                begin
                  ShowMessage('Немогу выполнить ShellExecute !')
                end;
            // Используем WinExec
              if WinExec('Notepad c:\config.sys', SW_SHOW) < 32 then
                begin
                  ShowMessage('Немогу выполнить WinExec !')
                end;
            end;
            полный и лучший аналог это CreateProcess :yes:
              Цитата dron-s @
              CreateProcess

              ничего общего с ShellExecute не имеет.
                Еще глянь TFileRun. То же з этой области.

                в uses - ExtActns
                Сообщение отредактировано: Alexo -
                  ну тогда уж и winexec()
                  :)
                    ExpandedWrap disabled
                      ShellExecute(Handle , nil , 'mysqldump' , ' -u root 111 note > note.bd ' , nil , SW_RESTORE);

                    *здесь : дамп таблицы note из БД 111 в файл note.bd



                    искал решение проблемы и наткнулся на посты...


                    проблема в том , что не могу сделать дамп из Delphi =/ , утилита выполняется на ура из Винды , а вот из Delphi никак
                    поправьте несли что не так =/
                      Цитата Second @
                      искал решение проблемы и наткнулся на посты...


                      Ну тогда еще и сюда наткнись - Проблема с ShellExecute

                      Смотри в ветке цитату из MSDN про полный путь к исполняемому файлу
                        Цитата Демо @
                        Цитата Second @
                        искал решение проблемы и наткнулся на посты...


                        Ну тогда еще и сюда наткнись - Проблема с ShellExecute

                        Смотри в ветке цитату из MSDN про полный путь к исполняемому файлу

                        ты об этом??

                        lpFile
                        [in] Pointer to a null-terminated string that specifies the file or object on which to execute the specified verb. To specify a Shell namespace object, pass the fully qualified parse name. Note that not all verbs are supported on all objects. For example, not all document types support the "print" verb

                        Добавлено
                        что мне нужно исправить ?? не совсем разберу =/
                          Для mysqldump нужно полный путь указать.

                          Добавлено
                          и название полное - mysqldump.exe
                            все замечательно исправил т.к. вы рекомедовали, а воз и ныне там =/

                            ExpandedWrap disabled
                              Var
                                SL : TStringList;
                                I , J : Integer;
                                S , SS , spath: String;
                               
                              begin
                                     Getdir(0,spath);
                                     ShellExecute(Handle , nil , PChar(spath+'\mysqldump.exe')  , ' -u root 111 note > note.bd ' , PChar(spath) , SW_SHOWNORMAL)
                              end;


                            запускает утилиту расчудесно и даже выполняет какие то операции , но результата не видно все равно =/
                            прошу пощады...
                              Цитата Second @
                              -u root 111 note > note.bd


                              Тебе не кажется, что здесь тоже желательно путь указать?
                                ExpandedWrap disabled
                                  ShellExecute(Handle , nil , PChar(spath+'\mysqldump.exe')  , ' -u root 111 note > D:\note.bd ' , PChar(spath) , SW_SHOWNORMAL)

                                так ??

                                нуль эмоций....
                                в КС винды катит , а в Delphi никак...
                                Сообщение отредактировано: Second -
                                  у меня кстате тоже иногда ShellExecute глючит на некоторых компах запускает а на некоторых нет ( и непонятно в чём дело. единственое отличие которое есть это то что папки в которых хранятся программа там где работает созданы через винду, а там где не работает созданы через cmd md имя_папки.
                                    Abbadon. А зачем тебе этот ShellExecute? Юзай WinExec и будет тебе счастье. Надежная, проверенная временем функция :lol: . Еще один аналог - System, из MSVCRT.DLL.
                                      Перенаправлением занимается интерпритатор командной строки, вот его и запускай
                                        О такую давнюю тему подняли. Я и не думал, что ею уже кто-то заинтересуется - а тут раз уведомление по почте (мда хороший таки форум ИСХОДНИКИ ;))
                                        Я, если не ошибаюсь решил проблему тем, что в Delphi есть ShellExecute, просто в USES надо было добавить WINAPI или SYSTEM.
                                        А вообще для простых операций стал пользоваться WinExec.
                                          Да здраствует прошлый век, век Win 3.1
                                            Цитата Anatoly Podgoretsky @
                                            Да здраствует прошлый век, век Win 3.1


                                            Это к чему?
                                              Блин, ну что за манера левые инструменты использовать???
                                              ShellExecute хороша тем, что может выполнять действия оболички по типу "открыть" или "редактировать" - применительно к документам.
                                              А exe'шники лучше и проще запускать через CreateProcess или на худой конец WinExec.
                                                Цитата Anatoly Podgoretsky @
                                                Да здраствует прошлый век, век Win 3.1

                                                Обоснуйте, чем вам не нравится WinExec? просто и удобно
                                                  Цитата _Raven @
                                                  Обоснуйте, чем вам не нравится WinExec?


                                                  Обоснование находится в справке, которую рекомендуется читать до использования.
                                                    Цитата Anatoly Podgoretsky @
                                                    Обоснование находится в справке, которую рекомендуется читать до использования.

                                                    А я читал! И что там такого? Написано, что не рекомендуется применять WinExec, потому, что она устаревшая. Это не причина. Вопреки распространенному мнению, эта функция реализована в 2-х вариантах, как 16-битная и как 32-х. Никакого переключения в 16-битный режим не происходит и потерь скорости тоже нет. А еще в хелпе рекомендуется юзать CreateProcess. Это я, для того, чтобы запустить друой екзе, буду создавать 2 структуры и расписывать кучу параметров? Нет, не буду!
                                                      Хм а чего то сложного....
                                                      где основу взял, не помню...
                                                      ExpandedWrap disabled
                                                        function gsSysSpawn(const CmdLine: string; Visibility : integer): integer;
                                                        var
                                                           zCmdLine:array[0..512] of char;
                                                           zCurDir:array[0..255] of char;
                                                           WorkDir:String;
                                                           StartupInfo:TStartupInfo;
                                                           ProcessInfo:TProcessInformation;
                                                        //   r: DWord;
                                                        begin
                                                           StrPCopy(zCmdLine,CmdLine);
                                                           GetDir(0,WorkDir);
                                                           StrPCopy(zCurDir,WorkDir);
                                                           FillChar(StartupInfo,Sizeof(StartupInfo),#0);
                                                           StartupInfo.cb := Sizeof(StartupInfo);
                                                           StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
                                                           StartupInfo.wShowWindow := Visibility;
                                                           if not CreateProcess(
                                                              nil,
                                                              zCmdLine,                      { pointer to command line string }
                                                              nil,                           { pointer to process security attributes}
                                                              nil,                           { pointer to thread security attributes }
                                                              false,                         { handle inheritance flag }
                                                              {CREATE_NEW_CONSOLE or}          { creation flags }
                                                              NORMAL_PRIORITY_CLASS,
                                                              nil,                           { pointer to new environment block }
                                                              nil,                           { pointer to current directory name }
                                                              StartupInfo,                   { pointer to STARTUPINFO }
                                                              ProcessInfo) then Result := -1 { pointer to PROCESS_INF }
                                                           else
                                                           begin
                                                        {      CloseHandle(ProcessInfo.hThread);
                                                              WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
                                                              CloseHandle(ProcessInfo.hProcess);
                                                              GetExitCodeProcess(ProcessInfo.hProcess,r);}
                                                              Result := ProcessInfo.hProcess;
                                                           end;
                                                        end;
                                                        Virtuals Ничего сложного нет. Просто это не дзенно - кода много -> смысл тот же, что и в одной WinExec.
                                                          Кроме простоты, функция WinExec имет одну весьма полезную особенность - возврат из нее происходит, когда приложение полностью стартует - начнет принимать сообщения.
                                                            Цитата _Raven @
                                                            А еще в хелпе рекомендуется юзать CreateProcess. Это я, для того, чтобы запустить друой екзе, буду создавать 2 структуры и расписывать кучу параметров? Нет, не буду!


                                                            Срочно меняй профессию, это не твое.
                                                              Цитата _Raven @
                                                              Virtuals Ничего сложного нет. Просто это не дзенно - кода много -> смысл тот же, что и в одной WinExec.

                                                              не дзенно... одни
                                                              { pointer to process security attributes}
                                                              { pointer to thread security attributes }
                                                              чего стоят
                                                              а
                                                              { pointer to STARTUPINFO }
                                                              и возвращаемая
                                                              { pointer to PROCESS_INF }
                                                              .........

                                                              короче стартуем все и как хотим, и получаем много того что хочется.
                                                              имхо считаю что это и есть дзен \код компактен, многофункционален, и не проходит кучу надстроек от мс\
                                                              ЗЫ пример кривых условий в от мс
                                                              Функция GetWindowText
                                                              в мсдн сказанно что НЕЗЯ читать текст принадлежащий другому приложению, /наверное всем понятно условие, которое стоит в функции/ НО
                                                              если..
                                                              в начале ...
                                                              ExpandedWrap disabled
                                                                function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: LongInt): LRESULT;stdcall;
                                                                var tmr:LRESULT;
                                                                begin
                                                                   tmr:=SendMessage(hWnd, WM_GETTEXT, WPARAM(nMaxCount),lparam(lpString));
                                                                   result:=tmr;
                                                                end;
                                                              то мсдн идет лесом.
                                                              извиняюсь за отвлеченный пример, но он достаточно показателен
                                                              Сообщение отредактировано: Virtuals -
                                                                Virtuals

                                                                Уже много раз говорилось, что для каждой цели есть свои средства.
                                                                Так же точно и WinExec может служить не хуже CreateProcess. Каждый для своей задачи.
                                                                Выше я описал особенность WinExec. В случае с CreateProcess реализовать такую функцию будет значительно сложнее. Зачем усложнять себе жизнь?

                                                                Добавлено
                                                                Цитата Anatoly Podgoretsky @
                                                                рочно меняй профессию, это не твое.


                                                                Кроме этого есть аргументы?
                                                                  ладно.....
                                                                  для спорщиков. :D
                                                                  WinExec всего лиш оболочка для CreateProcess
                                                                  в реализации от мс выглядит так:

                                                                  W2K
                                                                  Copyright © Microsoft Corporation
                                                                  ExpandedWrap disabled
                                                                    /*
                                                                     * Code taken from kernel32.dll
                                                                     */
                                                                    #define DEFAULT_WAIT_FOR_INPUT_IDLE_TIMEOUT 30000
                                                                     
                                                                    UINT WinExecN( LPCTSTR lpCmdLine, UINT uCmdShow )
                                                                    {
                                                                        STARTUPINFO StartupInfo;
                                                                        PROCESS_INFORMATION ProcessInformation;
                                                                        BOOL CreateProcessStatus;
                                                                        DWORD ErrorCode;
                                                                     
                                                                        ZeroMemory(&StartupInfo,sizeof(StartupInfo));
                                                                        StartupInfo.cb = sizeof(StartupInfo);
                                                                        StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
                                                                        StartupInfo.wShowWindow = (WORD)uCmdShow;
                                                                        CreateProcessStatus = CreateProcess(
                                                                                                NULL,
                                                                                                (LPTSTR)lpCmdLine,
                                                                                                NULL,
                                                                                                NULL,
                                                                                                FALSE,
                                                                                                0,
                                                                                                NULL,
                                                                                                NULL,
                                                                                                &StartupInfo,
                                                                                                &ProcessInformation
                                                                                                );
                                                                     
                                                                        if ( CreateProcessStatus ) {
                                                                            //
                                                                            // Wait for the started process to go idle. If it doesn't go idle in
                                                                            // 10 seconds, return anyway.
                                                                            //
                                                                            WaitForInputIdle(ProcessInformation.hProcess,
                                                                                        DEFAULT_WAIT_FOR_INPUT_IDLE_TIMEOUT);
                                                                            CloseHandle(ProcessInformation.hProcess);
                                                                            CloseHandle(ProcessInformation.hThread);
                                                                            return 33;
                                                                            }
                                                                        else {
                                                                            //
                                                                            // If CreateProcess failed, then look at GetLastError to determine
                                                                            // appropriate return code.
                                                                            //
                                                                     
                                                                            ErrorCode = GetLastError();
                                                                            switch ( ErrorCode ) {
                                                                                case ERROR_FILE_NOT_FOUND:
                                                                                    return 2;
                                                                     
                                                                                case ERROR_PATH_NOT_FOUND:
                                                                                    return 3;
                                                                     
                                                                                case ERROR_BAD_EXE_FORMAT:
                                                                                    return 11;
                                                                     
                                                                                default:
                                                                                    return 0;
                                                                                }
                                                                            }
                                                                    }
                                                                    Цитата
                                                                    Срочно меняй профессию, это не твое.

                                                                    Моя профессия - студент университета, так что здесь я вас не послушаю ;) . Это первое.
                                                                    Второе - краткость, минимализм - разве это не главный принцип программирования? Почитайте Дениса Ритчи, разработчика C.
                                                                    2 Virtuals где именно в MSDN написано про текст, с другого приложения? А на счет кода с WinExec, да я это давно подозревал(хотя точно не знал), так как писал выше, WinExec есть в двух вариантах. Так зачем писать дважды одно и тоже?
                                                                    2 остальным - WinExec есть у Vista, почему же она есть, если устаревшая? Майкрософт долго будет держать в ядре старые апишки для совместимости.
                                                                      Цитата Virtuals @
                                                                      ладно.....
                                                                      для спорщиков.
                                                                      WinExec всего лиш оболочка для CreateProcess
                                                                      в реализации от мс выглядит так:


                                                                      И?
                                                                      Для спорщиков. Чтобы понять, что сказать хотел?
                                                                        Цитата Демо @
                                                                        Цитата Virtuals @
                                                                        ладно.....
                                                                        для спорщиков.
                                                                        WinExec всего лиш оболочка для CreateProcess
                                                                        в реализации от мс выглядит так:


                                                                        И?
                                                                        Для спорщиков. Чтобы понять, что сказать хотел?

                                                                        сказать хотел только то что,
                                                                        WinExec
                                                                        есть оболочка для
                                                                        CreateProcess
                                                                        и более ничего, с конкретным примером от мс, /как у них это реализованно/

                                                                        Добавлено
                                                                        Цитата _Raven @
                                                                        2 Virtuals где именно в MSDN написано про текст, с другого приложения?


                                                                        This function cannot retrieve the text of an edit control in another application.
                                                                        Remarks

                                                                        This function causes a WM_GETTEXT message to be sent to the specified window or control.
                                                                        This function cannot retrieve the text of an edit control in another application.

                                                                        это не оно?
                                                                        Сообщение отредактировано: Virtuals -
                                                                          Цитата Virtuals @

                                                                          Функция GetWindowText
                                                                          в мсдн сказанно что НЕЗЯ читать текст принадлежащий другому приложению, /наверное всем понятно условие, которое стоит в функции/ НО
                                                                          если..
                                                                          в начале ...
                                                                          function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: LongInt): LRESULT;stdcall;
                                                                          var tmr:LRESULT;
                                                                          begin
                                                                          tmr:=SendMessage(hWnd, WM_GETTEXT, WPARAM(nMaxCount),lparam(lpString));
                                                                          result:=tmr;
                                                                          end;
                                                                          то мсдн идет лесом.
                                                                          извиняюсь за отвлеченный пример, но он достаточно показателен

                                                                          бред. Цитата с MSDN, как с этим связана? Ты неправильно все понял. Думаешь изобрел велосипед, узнав, что текст можна получать с помошью WM_GETTEXT? Или что ты пытаешся доказать? Зачем заново писать WinExec, если он уже есть.
                                                                            я WinExec заново писать никого не вынуждаю, просто чаще мне функционала WinExec не хватает. а заполнить все структуры для CreateProcess нет ничего сложного. примеры привел выше как на паскале так и в реализации мс в вин2к
                                                                            если рекомендуют использовать CreateProcess так почему бы и нет?
                                                                            кусок исходного кода WinExec привел для того чтобы показать возможности использования CreateProcess
                                                                            в том числе и
                                                                            Цитата
                                                                            Кроме простоты, функция WinExec имет одну весьма полезную особенность - возврат из нее происходит, когда приложение полностью стартует - начнет принимать сообщения.

                                                                            Цитата
                                                                            Выше я описал особенность WinExec. В случае с CreateProcess реализовать такую функцию будет значительно сложнее.

                                                                            :D

                                                                            Цитата
                                                                            Думаешь изобрел велосипед, узнав, что текст можна получать с помошью WM_GETTEXT?

                                                                            велосипед изобретать не собираюсь,
                                                                            GetWindowText реализованна с помощью WM_GETTEXT НО стоит условие "если чужое окно, то облом" /исходный код искать влом, но поверьте на слово так оно и есть/
                                                                            также WinExec реализованна с помощью все той-же CreateProcess /что и показал выше/

                                                                            ИМХО
                                                                            и не получится так что в следующих версиях винды в WinExec появится условие /запускать только одобренные мс$ приложения :D /
                                                                            по аналогии с GetWindowText
                                                                              Virtuals

                                                                              Всё-таки, зачем сложно, если можно просто?
                                                                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                              0 пользователей:


                                                                              Рейтинг@Mail.ru
                                                                              [ Script execution time: 0,1816 ]   [ 15 queries used ]   [ Generated: 4.11.25, 17:51 GMT ]