Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 12:30   #11
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BarakudaX777 Посмотреть сообщение
Код:
//Закрываем все ранее открытые туннели
  while FindWindow(nil,'inteh56.ru - tunneling')<>0 do      
      SendMessage(FindWindow(nil,'myputty - tunneling'),WM_DESTROY,0,0);
Вот эту часть не совсем понял.

1. Должно быть, наверное,
Код:
while FindWindow(nil,'myputty - tunneling')<>0 do
, а не
Код:
while FindWindow(nil,'inteh56.ru - tunneling')<>0 do
2. Putty запускается в невидимом режиме. Как тогда можно найти окно 'myputty - tunneling', если его нет? И как стандартную надпись окна терминала putty заменить на нужную мне?
WoodHead вне форума Ответить с цитированием
Старый 22.03.2013, 15:22   #12
BarakudaX777
Пользователь
 
Регистрация: 13.06.2010
Сообщений: 53
По умолчанию

Цитата:
Сообщение от WoodHead Посмотреть сообщение
Вот эту часть не совсем понял.

1. Должно быть, наверное,
Код:
while FindWindow(nil,'myputty - tunneling')<>0 do
, а не
Код:
while FindWindow(nil,'inteh56.ru - tunneling')<>0 do
2. Putty запускается в невидимом режиме. Как тогда можно найти окно 'myputty - tunneling', если его нет? И как стандартную надпись окна терминала putty заменить на нужную мне?
Все нормально работает так как я указал вначале. Окно я заголовок сменил, поэтому и inteh56.ru - tunneling
BarakudaX777 вне форума Ответить с цитированием
Старый 22.03.2013, 15:42   #13
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BarakudaX777 Посмотреть сообщение
Все нормально работает так как я указал вначале. Окно я заголовок сменил, поэтому и inteh56.ru - tunneling
Речь не о том, что у вас все работает. Просто я логику работы недопонимаю, об этом и написал.
Еще раз, почему ищем одно окно, а закрываем другое?
Код:
//Закрываем все ранее открытые туннели
  while FindWindow(nil,'inteh56.ru - tunneling')<>0 do      
      SendMessage(FindWindow(nil,'myputty - tunneling'),WM_DESTROY,0,0);
Я так понимаю: ищем окно "inteh56.ru - tunneling". Если находим, то "убиваем" окно "myputty - tunneling". По идее, процесс должен зациклиться, т.к. названия окон разные. Об этом я и просил рассказать.
WoodHead вне форума Ответить с цитированием
Старый 23.03.2013, 14:01   #14
BarakudaX777
Пользователь
 
Регистрация: 13.06.2010
Сообщений: 53
По умолчанию

Цитата:
Я так понимаю: ищем окно "inteh56.ru - tunneling".
Теперь понял о чем вы. это я тут видимо описался. В программе у меня все на inteh56
BarakudaX777 вне форума Ответить с цитированием
Старый 23.03.2013, 15:16   #15
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Еще вопрос, если позволите.
Интересует вот этот участок кода:
Код:
with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_HIDE;
  end;
Я так понимаю, что окно "inteh56.ru - tunneling" - это окно терминала putty?

Первый вопрос: как вы переименовали заголовок окна?
Я пробовал переименовать с помощью lpTitle, но почему-то заголовок окна не менялся.Может как-то не так делал, вот код:
Код:
with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_HIDE;
    lpTitle:='newtitlename';
  end;
Второй вопрос:
Окно запускается в невидимом режиме, т.к. "wShowWindow := SW_HIDE;".
В диспетчере задач окна "inteh56.ru - tunneling" не наблюдается, только процесс "putty". Каким образом функция FindWindow находит окно?
WoodHead вне форума Ответить с цитированием
Старый 24.03.2013, 19:56   #16
BarakudaX777
Пользователь
 
Регистрация: 13.06.2010
Сообщений: 53
По умолчанию

Цитата:
Сообщение от WoodHead Посмотреть сообщение
Еще вопрос, если позволите.
Интересует вот этот участок кода:
Код:
with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_HIDE;
  end;
Я так понимаю, что окно "inteh56.ru - tunneling" - это окно терминала putty?

Первый вопрос: как вы переименовали заголовок окна?
Я пробовал переименовать с помощью lpTitle, но почему-то заголовок окна не менялся.Может как-то не так делал, вот код:
Код:
with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_HIDE;
    lpTitle:='newtitlename';
  end;
Второй вопрос:
Окно запускается в невидимом режиме, т.к. "wShowWindow := SW_HIDE;".
В диспетчере задач окна "inteh56.ru - tunneling" не наблюдается, только процесс "putty". Каким образом функция FindWindow находит окно?
Переименовывал окно в самом пути. Там можно указать заголовок окна. По поводу второго вопроса, сам не понимаю. Но это работает.
BarakudaX777 вне форума Ответить с цитированием
Старый 25.03.2013, 05:44   #17
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BarakudaX777 Посмотреть сообщение
Переименовывал окно в самом пути. Там можно указать заголовок окна.
Тут вот какая штука:
- в putty на вкладке Window->Behaviour в поле ввода "Window title" добавляю имя окна, например "myputtywindow";
- запускаю программу putty (не из Delphi, а просто из Windows), и вижу, что название окна putty поменялось на нужное мне, т.е. "myputtywindow";
- после установления коннекта имя окна опять меняется на "username@h11:~".
Собственно, не понимаю, что я делаю не так.

P.S. Извиняюсь, поторопился с вопросом.
Оказывается, нужно на вкладке Terminal->Features поставить галочку в поле "Disable remote-contolled window title changing".

Последний раз редактировалось WoodHead; 25.03.2013 в 05:51.
WoodHead вне форума Ответить с цитированием
Старый 25.03.2013, 06:07   #18
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Еще есть вопрос-дополнение к коду, приведенному в ТС.
Вот здесь http://www.delphirus.com/article32.html рекомендуется:
- указатели hProcess и hThread должны быть закрыты в родительском процессе функцией CloseHandle иначе произойдет утечка памяти; CloseHandle не закрывает процесс (поток), а только уменьшает счетчики открытых дескрипторов;
- если приложение Win32, то после создания процесса желательно дождаться завершения его инициализации функцией WaitForInputIdle.

Получается, что код должен быть такой:
Код:
...
//Запускаем putty
  ssh_process := CreateProcess(PChar(path+'\'+'putty.exe'), ' -load "myputty"', nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, SSHProcessInfo);

  if ssh_process then
  with ProcessInfo do 
  begin
    WaitForInputIdle(hProcess, INFINITE); // ждем завершения инициализации
    CloseHandle(hThread); // закрываем дескриптор процесса
    CloseHandle(hProcess); // закрываем дескриптор потока
  end
  else Error := GetLastError;
Можете прокомментировать это?
WoodHead вне форума Ответить с цитированием
Старый 25.03.2013, 06:15   #19
BarakudaX777
Пользователь
 
Регистрация: 13.06.2010
Сообщений: 53
По умолчанию

Цитата:
Сообщение от WoodHead Посмотреть сообщение
Можете прокомментировать это?
Я так понимаю просто приложение будет работать, а ссылки на дескрипторы в Delphi отлинкуются.
Память может и освободится, но управление процессом мы потеряем. Я это понимаю так. Я в этом тоже не очень понимаю.
BarakudaX777 вне форума Ответить с цитированием
Старый 25.03.2013, 06:22   #20
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BarakudaX777 Посмотреть сообщение
Я так понимаю просто приложение будет работать, а ссылки на дескрипторы в Delphi отлинкуются.
Память может и освободится, но управление процессом мы потеряем.
Не совсем понял про "управление процессом мы потеряем", ведь соединение с MySQL выполняется, данные из базы считываются (проверено). Тем более "CloseHandle не закрывает процесс (поток)".

P.S. Кажется, я понимаю, что вы имеете ввиду под "управление процессом мы потеряем".
Если попробовать завершить процесс командой "TerminateProcess(hProcess, NO_ERROR);" после того, как закрыли указатели hProcess и hThread, то ничего не получится. Если же указатели не закрывать, то процесс закрывается.

Проиллюстрирую.
Например, процесс не убивается:
Код:
WaitForInputIdle(hProcess, INFINITE); // ждем завершения инициализации
CloseHandle(hThread); // закрываем дескриптор процесса
CloseHandle(hProcess); // закрываем дескриптор потока
TerminateProcess(hProcess, NO_ERROR);
Процесс убивается:
Код:
WaitForInputIdle(hProcess, INFINITE); // ждем завершения инициализации
TerminateProcess(hProcess, NO_ERROR);
CloseHandle(hThread); // закрываем дескриптор процесса
CloseHandle(hProcess); // закрываем дескриптор потока
Но, разумеется, процесс можно "убить", закрыв окно через
Код:
SendMessage(FindWindow(nil,'myputty - tunneling'),WM_DESTROY,0,0);
, как вы и делали в вашем примере. Даже если перед этим закрыть указатели hProcess и hThread. Вот только не знаю, будут ли утечки памяти в случае, если указатели не закрывать, а процесс убить через SendMessage.

P.P.S.
Думаю, все-таки правильней убивать процесс, зная его хэндл, т.е. указатель hProcess (возможно, я выразился некорректно, но мысль, я думаю, вы поняли), а не через SendMessage.
Например, если я на компьютере запускаю несколько программ (при запуске каждой программы создается свой туннель через putty), а потом по одной закрываю, то будет "убиваться" туннель, соответствующий закрываемой программе. А в случае:
Код:
//Закрываем все ранее открытые туннели
  while FindWindow(nil,'inteh56.ru - tunneling')<>0 do      
      SendMessage(FindWindow(nil,'inteh56.ru - tunneling'),WM_DESTROY,0,0);
закроются все туннели, даже если закроете одну программу, а остальные останутся открытые.
Разумеется, это актуально в том случае, если вы допускаете запуск нескольких копий программы на одном компьютере.

Последний раз редактировалось WoodHead; 25.03.2013 в 07:12.
WoodHead вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подождать пока активное окно TwiX Общие вопросы Delphi 3 20.03.2012 08:54
Какой код выполнится быстрее? _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 33 12.09.2010 19:54
не могу запустить серв через putty.exe WebMaster89 Помощь студентам 0 04.04.2010 07:57
как подождать о определить закрытие приложения Анастасия123456789 Общие вопросы Delphi 1 02.05.2009 16:30
Запустить другую программу и подождать, пока она отработает Олвин Помощь студентам 15 22.04.2008 00:35