ShellExecute
, Подкажите аналог...
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.5] |
|
|
ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
| Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
ShellExecute
, Подкажите аналог...
|
Сообщ.
#16
,
|
|
|
|
у меня кстате тоже иногда ShellExecute глючит на некоторых компах запускает а на некоторых нет ( и непонятно в чём дело. единственое отличие которое есть это то что папки в которых хранятся программа там где работает созданы через винду, а там где не работает созданы через cmd md имя_папки.
|
|
Сообщ.
#17
,
|
|
|
|
Abbadon. А зачем тебе этот ShellExecute? Юзай WinExec и будет тебе счастье. Надежная, проверенная временем функция
. Еще один аналог - System, из MSVCRT.DLL. |
|
Сообщ.
#18
,
|
|
|
|
Перенаправлением занимается интерпритатор командной строки, вот его и запускай
|
|
Сообщ.
#19
,
|
|
|
|
О такую давнюю тему подняли. Я и не думал, что ею уже кто-то заинтересуется - а тут раз уведомление по почте (мда хороший таки форум ИСХОДНИКИ
)Я, если не ошибаюсь решил проблему тем, что в Delphi есть ShellExecute, просто в USES надо было добавить WINAPI или SYSTEM. А вообще для простых операций стал пользоваться WinExec. |
|
Сообщ.
#20
,
|
|
|
|
Да здраствует прошлый век, век Win 3.1
|
|
Сообщ.
#21
,
|
|
|
|
Цитата Anatoly Podgoretsky @ Да здраствует прошлый век, век Win 3.1 Это к чему? |
|
Сообщ.
#22
,
|
|
|
|
Блин, ну что за манера левые инструменты использовать???
ShellExecute хороша тем, что может выполнять действия оболички по типу "открыть" или "редактировать" - применительно к документам. А exe'шники лучше и проще запускать через CreateProcess или на худой конец WinExec. |
|
Сообщ.
#23
,
|
|
|
|
Цитата Anatoly Podgoretsky @ Да здраствует прошлый век, век Win 3.1 Обоснуйте, чем вам не нравится WinExec? просто и удобно |
|
Сообщ.
#24
,
|
|
|
|
Цитата _Raven @ Обоснуйте, чем вам не нравится WinExec? Обоснование находится в справке, которую рекомендуется читать до использования. |
|
Сообщ.
#25
,
|
|
|
|
Цитата Anatoly Podgoretsky @ Обоснование находится в справке, которую рекомендуется читать до использования. А я читал! И что там такого? Написано, что не рекомендуется применять WinExec, потому, что она устаревшая. Это не причина. Вопреки распространенному мнению, эта функция реализована в 2-х вариантах, как 16-битная и как 32-х. Никакого переключения в 16-битный режим не происходит и потерь скорости тоже нет. А еще в хелпе рекомендуется юзать CreateProcess. Это я, для того, чтобы запустить друой екзе, буду создавать 2 структуры и расписывать кучу параметров? Нет, не буду! |
|
Сообщ.
#26
,
|
|
|
|
Хм а чего то сложного....
где основу взял, не помню... ![]() ![]() 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; |
|
Сообщ.
#27
,
|
|
|
|
Virtuals Ничего сложного нет. Просто это не дзенно - кода много -> смысл тот же, что и в одной WinExec.
|
|
Сообщ.
#28
,
|
|
|
|
Кроме простоты, функция WinExec имет одну весьма полезную особенность - возврат из нее происходит, когда приложение полностью стартует - начнет принимать сообщения.
|
|
Сообщ.
#29
,
|
|
|
|
Цитата _Raven @ А еще в хелпе рекомендуется юзать CreateProcess. Это я, для того, чтобы запустить друой екзе, буду создавать 2 структуры и расписывать кучу параметров? Нет, не буду! Срочно меняй профессию, это не твое. |
|
Сообщ.
#30
,
|
|
|
|
Цитата _Raven @ Virtuals Ничего сложного нет. Просто это не дзенно - кода много -> смысл тот же, что и в одной WinExec. не дзенно... одни { pointer to process security attributes} { pointer to thread security attributes } чего стоят а { pointer to STARTUPINFO } и возвращаемая { pointer to PROCESS_INF } ......... короче стартуем все и как хотим, и получаем много того что хочется. имхо считаю что это и есть дзен \код компактен, многофункционален, и не проходит кучу надстроек от мс\ ЗЫ пример кривых условий в от мс Функция 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; извиняюсь за отвлеченный пример, но он достаточно показателен |