Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andead
а ты не пробывал ручками фильтрацию делать, а не всё скалдывать на компонент?

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 07:46 04-10-2006
deadbitch



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wader

Цитата:
deadbitch  
Ага, из метафайла.  
 
вот примерный код:  
Исходник  

 
О, спасибо! Работает быстрее всех предыдущих вариантов, даже с полноцветными градиентными EMF, супер! big thnx!!

Всего записей: 340 | Зарегистр. 13-01-2005 | Отправлено: 10:16 04-10-2006
Saxonika



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем!
 
Ребята помоги мне пожалуйста. У меня такой головной боль. Не знаю как побороть...
 
Мне нужно запустить программу так, чтобы она не знала о существовании родительского процесса.  
Как запустить программу от имени операционной системы? и долждаться её окончания.
 
Как я это делаю и зачем всё это:
 
1) есть программа, назовём её "не-моя" (буржуйские корейцы написали)
 
2) эта программа "не-моя" работает в комплексе с другими программами "не-моими", но может быть запущена и самостоятельно без остальных программ (хотя вроде как это и не предусмотрено, но весь комплекс разбит на части по программам и эти программы просто работают по цепочке передавая другу другу информацию).
 
3) если программу "не-мою" запустить из-под explorer или того же far, то программа "не-моя" всё правильно делает, производит все необходимые операции, генерирует и сохраняет результат, а по окночанию чудно и великолепно выходит.
 
4) если программу "не-мою" запускаю из-под своей программы, то программа "не-моя" опять всё чудно делает, всё на ура, но ... в конце она виснет !!!!
 
Я сделал такое предположение, что программа "не-моя" просто определяет родительский процесс и если таковой найден, то она считает, что это одна из программ комплекса и пытается с ней в конце своей работы как-то взаимодействовать, ну типа сообщить ей о результате своей работы (и потому вовсе она не виснет, а просто ждёт что родительский процесс чего-то ей сообщит). Но о том как происходит это взаимодействие я не знаю и инфы никакой нет.  
 
Запускаю я всё это достаточно стандартно...
 

Код:
 
 
    var
      si: TStartupInfo;
      pi: TProcessInformation;
 
    begin
 
     FillChar(si, SizeOf(si),0);
     si.cb := SizeOf(si);
     FillChar(pi, SizeOf(pi),0);
 
     if CreateProcess(PChar('ProgramToRun.exe'), nil,
     nil, nil,  
     false,    
     CREATE_NEW_CONSOLE or // creation flags
     NORMAL_PRIORITY_CLASS,
     nil,
     nil,
     si,  
     pi)
     then
     begin
       WaitForSingleObject(pi.hProcess, INFINITE);
       CloseHandle(pi.hProcess);
       CloseHandle(pi.hThread);
     end
     else
       MessageDlg(SysErrorMessage(GetLastError), mtError, [mbOK], 0);
    end;
 

 
Ребята помогите! Как запустить программу так, чтобы она не знала о родительском процессе и дождаться окончания её выполнения?
 
Спасибо.

Всего записей: 345 | Зарегистр. 26-04-2006 | Отправлено: 14:06 04-10-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Saxonika
Запусти ее чере ShellExecute

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 14:25 04-10-2006
Saxonika



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я уже пробовал и ShellExecute тоже. Моему горю оно не помогло.
 
Делал опять же вроде всё стандартно...

Код:
 
 
    var SEI:TShellExecuteInfo;
 
    begin
 
      ZeroMemory(@SEI,sizeof(SEI));
      SEI.cbSize:=sizeof(SEI);
 
      SEI.fMask:=SEE_MASK_NOCLOSEPROCESS;
      SEI.Wnd:=Application.Handle;
      SEI.lpVerb:='open';
      SEI.lpFile:=PChar('ProgramToRun.exe');
      SEI.nShow:=SW_SHOWDEFAULT;
 
      if ShellExecuteEx(@SEI) then WaitForSingleObject(SEI.hProcess,INFINITE);
    end;
 
 

Всего записей: 345 | Зарегистр. 26-04-2006 | Отправлено: 17:57 04-10-2006
andead



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S

Цитата:
а ты не пробывал ручками фильтрацию делать, а не всё скалдывать на компонент?

ну если в компаненте реализованно, значит нада юзать =) да и неохота для 20 полей делать фильтр, в DBGridEh гораздо симпатичнее

Всего записей: 1821 | Зарегистр. 22-09-2005 | Отправлено: 18:08 04-10-2006 | Исправлено: andead, 18:10 04-10-2006
Ramazan



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Saxonika
А с использованием команды START не пробовал?

Всего записей: 359 | Зарегистр. 13-04-2002 | Отправлено: 18:14 04-10-2006
wader



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Saxonika
Попробуй вот так: ShellExecute(0,nil,'ProgramToRun.exe',nil,nil,SW_SHOWNORMAL)
Для чего ShellExecuteEx используешь? и вот это WaitForSingleObject зачем?
Чего ты добится хочешь?

Всего записей: 113 | Зарегистр. 26-05-2005 | Отправлено: 19:53 04-10-2006
Saxonika



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А что это за команда START? это откудаво? В командной строке такая не запускается..
 
Пробовал я и ShellExecute - таже история. То что ParentWindow=0 ничо не даёт.
 
Процедуру WaitForSingleObject я использую чтобы дождаться окончания выполнения "ProgramToRun.exe". Она вроде как стандартная и используется в WinApi для этих целей.
 
Мне нуно дождаться окончания выполнения !!!  
 
Если бы не нуно было дожидаться окончания выполнения, я бы просто Shell.Open('ProgramToRun.exe') - и всё! все проблемы решены. Я проверял. Работает на ура.
Но в этом случае программа отрывается и уходит в свободное плавание.

Всего записей: 345 | Зарегистр. 26-04-2006 | Отправлено: 21:28 04-10-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Saxonika

Цитата:
Мне нуно дождаться окончания выполнения !!!

В качестве альтернативы WaitForSingleObject можно периодически проверять - запущен ли еще соответчтвующий процесс. Метод конечно не самый красивый, но при условии единственности такого процесса вполне может сработать

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 23:10 04-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ну если в компаненте реализованно, значит нада юзать =) да и неохота для 20 полей делать фильтр, в DBGridEh гораздо симпатичнее

а в чём составляет собствено проблема то????

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 09:57 05-10-2006
RostY



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Saxonika
когда-то я делал так: _http://rapidshare.de/files/35552015/LAUNCH.RAR.html

Всего записей: 387 | Зарегистр. 11-01-2006 | Отправлено: 10:56 05-10-2006 | Исправлено: RostY, 10:56 05-10-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RostY

Цитата:
когда-то я делал так

Посмотрел твой код. Через ShellExecuteEx у Saxonika не работает, а с ShellExecute так не получится. В MSDN написано

Цитата:
The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.


Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 14:04 05-10-2006 | Исправлено: RomanTim, 14:04 05-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
CreateProcess???

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:00 05-10-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S

Цитата:
CreateProcess???

Ты о том, что можно через CreateProcess запускать? Почитай выше - у человека прога при запуске через CreateProcess или ShellExecuteEx с последующим WaitForSingleObject зависает, при простом ShellExecute вроде нет, а ему надо узнать когда она завершится

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 15:09 05-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а через WinExec нормально работает?

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:14 05-10-2006
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Памагите решить такую проблемку:
Есть главная форма, есть дочерняя форма на которой TGauge который призван отображать состояние процесса, и кнопка отмена для прервывания процесса.  
Хочется сделать так чтобы пока не нажата кнопка отмена до основной формы добраться было нельзя, если я вывожу дочернюю через showmodal, то стоит процес который должен происходить, я так понимаю ждет ответа от закрытия модальной формы.
Как  быть чтобы и процесс шел, и доступной была только дочерняя форма с результатами?

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 20:56 05-10-2006
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Erazer
Выводи сам процесс в отдельный поток (TThread) и через Synchronize выводи текущие результаты его работы в форму (т.к. VCL компоненты не безопасны для многопоточного использования). Тогда таких проблемок не будет возникать.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 21:07 05-10-2006
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
пасибочки, мне недавно тут кодеры под .net одну мысль подсказали "Мыслить нужно абстрактно" ну это так к слову, а проблему я решил так: дочернюю форму оставил обычной , не модальной и дописал пару строчек
 "ProgressForm.Show;  MainForm.Enabled:=False;
  .....................................................................
  ProgressForm.Close; MainForm.Enabled:=True;" как  гоорится все гениальное просто
теперь другой вопрос... нужно удалить из папки все файлы...
использую для этого function DeleteFiles(Handle: Hwnd; FolderToClear: string; ToRecycle: Boolean):
  Integer;
var
  SHFileOpStruct    : TSHFileOpStruct;
begin
  PChar(FolderToClear);
  with SHFileOpStruct do
    begin
      Wnd := Handle;
      wFunc := FO_DELETE;
      pFrom := Pointer(FolderToClear);
      pTo := nil;
      fFlags := 0;
      if ToRecycle then
        fFlags := FOF_ALLOWUNDO;
      fFlags := FOF_NOCONFIRMATION;
      fAnyOperationsAborted := False;
      hNameMappings := nil;
      lpszProgressTitle := nil;
    end;
  Result := SHFileOperation(SHFileOpStruct);
end;
НО есть 1 проблема , если в названии папки включенной в путь есть хоть 1 пробел - не работает говорит что не удается произвести чтение с диска и т.д. и т.п. - не работает короче.
Т.е. если удалять из папки "D:\test\*.*" - работает , а из "D:\te st\*.*" нет.
а мало ль  как юзер папку обзовет ? есть же пример "C:\Program Files\" здесь оно тож работать не будет...
Шо делать ?

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 15:05 06-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Erazer
А с флагами ты немножно недобрал
вот поставь такие и все будет ОК

Цитата:
fFlags := FOF_FILESONLY + FOF_ALLOWUNDO + FOF_SILENT + FOF_NOCONFIRMATION;

Если хочеш исключать то FOF_ALLOWUNDO убери под условие.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 15:35 06-10-2006 | Исправлено: RedPromo, 15:38 06-10-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru