Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как сделать, чтобы putty открывалась при запуске


Автор: winsent7 24.1.2011, 17:11
Здравствуйте, идея вот в чем: хочу модернизировать программу записи в файл так, чтобы она сама открывала putty и отправляла строки не в файл, а в сразу в устройство, основная проблема: как сделать, чтобы программа открывала терминал, может кто подскажет? 

Автор: RastaDja 24.1.2011, 17:31
если просто запустить, тогда ShellExecute() или WinExec()
Вот код для проводника
Код

ShellExecute(m_hWnd, "open", "c:\\windows\\explorer.exe", NULL, NULL, SW_SHOWNORMAL);

WinExec("c:\\windows\\explorer.exe",SW_SHOW);


Добавлено через 57 секунд
чуть не забыл smile , надо shellapi.h включить

Автор: winsent7 25.1.2011, 09:32
Спасибо. Еще поясните пож-ста.
1. А в чем разница, если ее нет,  то WinExec() короче  :scratch_, one-s_head, и что значит SW_SHOW ?
2. При запуске выводится сообщение о подтверждении запуска putty, как это в программе указать?
3. Потом еще надо параметры подключения выставлять(скорость, номер порта)
Вобщем хочется, чтобы программа сама все это сделала и предложила уже ввести логин и пароль входа в устройство.   
 

Автор: jonie 25.1.2011, 10:16
WinExec не использовать - она устарела и будет удалена в дальнейшем.
Цитата

Note  This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.
(с) MSDN

Цитата

3. Потом еще надо параметры подключения выставлять(скорость, номер порта)

у патти есть коммандная строка - изучайте и прописывайте в неё что надо

Автор: winsent7 25.1.2011, 10:22
Спасибо, буду изучать.

Автор: winsent7 26.1.2011, 11:13
Не решается проблема запуска cmd - при выполнении программы появляется окно cmd, но написано там "Для продолжения нажмите любую клавишу...", после нажатия оной окно исчезает. Подскажите пож-ста что не так. Спасибо.
Код

#include <windows.h>

int main()
{
    
    ShellExecute(NULL,TEXT("open"),TEXT("c:\\windows\\cmd.exe"), NULL, NULL, SW_SHOWNORMAL);

        return 0;
}

 PS. с shellapi.h не работает почему-то (Visual 2008 EE)

Автор: xvr 26.1.2011, 11:39
Цитата(winsent7 @  26.1.2011,  11:13 Найти цитируемый пост)
Подскажите пож-ста что не так.
Не так путь к cmd. У меня на машине он лежит в C:\WINNT\system32\cmd.exe, на другой машине он может лежать в C:\windows\system32\cmd.exe, а на третьей вообще где угодно  smile (ну или почти где угодно)

Вопрос - нафига вам cmd? Вы же putty запускать собирались.



Автор: winsent7 26.1.2011, 11:55
Цитата

Вопрос - нафига вам cmd? Вы же putty запускать собирались

так мне по-любому нужна функция запуска cmd, а потом из cmd уже запускать сессию putty,
может  так прокатит?
 
ShellExecute(NULL,TEXT("open"),TEXT("c:\\windows\\system32\\cmd.exe\\putty -load "session""), NULL, NULL, SW_SHOWNORMAL);

Добавлено @ 12:04
не прокатило...

мне сразу надо в корневой попасть, это наверное в пятом параметре указывается?


Автор: xvr 26.1.2011, 12:08
Цитата(winsent7 @  26.1.2011,  11:55 Найти цитируемый пост)
так мне по-любому нужна функция запуска cmd, а потом из cmd уже запускать сессию putty,
Не надо, запускайте сразу putty, он же не .bat файл, что бы cmd им кормить  smile 

Цитата(winsent7 @  26.1.2011,  11:55 Найти цитируемый пост)
может  так прокатит?
Нет

Код

ShellExecute(NULL,TEXT("open"),TEXT("putty"),TEXT("-load \"session\""), NULL, SW_SHOWNORMAL); 


Автор: winsent7 26.1.2011, 12:59
В таком виде
Код

#include <windows.h>



int main()
{
    
    ShellExecute(NULL,TEXT("open"),TEXT("putty"),TEXT(" -load \"session\""),NULL, SW_SHOWNORMAL);

        return 0;
}

 результат
Цитата

при выполнении программы появляется окно cmd, но написано там "Для продолжения нажмите любую клавишу...", после нажатия оной окно исчезает.

буду пробовать разобраться, спасибо

Автор: xvr 26.1.2011, 16:20
Цитата(winsent7 @  26.1.2011,  12:59 Найти цитируемый пост)
результат
У вас на putty пути прописаны? Если просто открыть окно cmd и набрать там putty, что получается?


Автор: winsent7 28.1.2011, 20:29
Цитата

Если просто открыть окно cmd и набрать там putty, что получается?

запускается, но если предварительно положить ее в место где по умолчанию открывается cmd(может подскажете заодно как сделать, чтобы при запуске я в C:\ сразу оказывался. smile )

мне кажется проблема в том, что  программа пытается открыть putty там, где его нет, но пока не могу понять как отправить в нужное место.
Когда я просто запускаю через свою программу cmd(путь - TEXT("c:\\windows\\system32\\cmd.exe")), 
то вижу это - c:\Visual Studio\Projects\cmd\cmd> , соответственно когда параметр указываешь "Putty", программа не понимает где искать, наверное...

Автор: xvr 28.1.2011, 20:51
Цитата(winsent7 @  28.1.2011,  20:29 Найти цитируемый пост)
но пока не могу понять как отправить в нужное место.

Не надо его никуда направлять  smile В системе есть такое понятие, как переменные окружения (откройте cmd и наберите там set - увидите большой большой список). И в нем есть такая переменная, PATH называется (наберите set PATH) В этой переменной перечислены (через ';') пути, где система будет искать любую вашу программу, если вы не снабдили ее полным путем при запуске. Надо добавить туда путь на putty, и все будет запускаться. (Добавить можно через Мой Компьютер->Свойства->Дополнительно->Переменные среды)

Либо запускать putty через ShellExecute с полным путем (где он там у вас лежит?)

Добавлено через 3 минуты и 6 секунд
Цитата(winsent7 @  28.1.2011,  20:29 Найти цитируемый пост)
может подскажете заодно как сделать, чтобы при запуске я в C:\ сразу оказывался. 

Сделайте ярлык для cmd и пропишите ему в Свойствах C:\ в 'Рабочую папку'

Автор: winsent7 30.1.2011, 15:34
xvr, спасибо, буду экпериментировать.

Автор: winsent7 1.2.2011, 15:43
Сессия запускается, но надо нажать Enter, чтобы предложили ввести логин и пароль, как бы это программно сделать? 

Автор: winsent7 2.2.2011, 11:11
Видимо, с помощью SendInput(), осталось с параметрами разобраться  smile 

Автор: winsent7 4.2.2011, 09:29
Что-то не получается, подскажите пож-ста, наверное, косяк с названием Enter.
Код

#include <windows.h>


int main()
{
    
    ShellExecute(NULL,TEXT("open"),TEXT("c:\\putty.exe"),TEXT(" -load \"COM\""),NULL,SW_SHOWNORMAL);

     INPUT it[2];
 
                 it[0].type = INPUT_KEYBOARD;
                 it[0].ki.wVk = VK_ENTER;

     it[1].type = INPUT_KEYBOARD;
                 it[1].ki.wVk = VK_ENTER;
     it[1].ki.dwFlags = KEYEVENTF_KEYUP;
                    
                 SendInput(2,it, sizeof(it));


           

        return 0;
}
 
В таком виде пишет " необъявленный идентификатор VK_ENTER"
Спасибо.

Добавлено @ 09:41
Только что нашел(полдня не мог найти) - VK_RETURN, буду пробовать

Автор: winsent7 4.2.2011, 09:54
Не работает, компилится без ошибок, но эфеект имеет странный, после попытки запуска моей программы, putty не реагирует потом на ENTER, что бы это могло быть? 

Автор: winsent7 4.2.2011, 17:06
Цитата

putty не реагирует потом на ENTER
с этим разобрался, теперь просто не работает, как будто и нет вовсе SendInput() в коде, проверил тот же код на командной строке - работает: открывает cmd и нажимает там Enter smile , нужна помощь!

Автор: winsent7 10.2.2011, 14:47
Цитата

не работает, как будто и нет вовсе SendInput() в коде, проверил тот же код на командной строке - работает: открывает cmd и нажимает там Enter  , нужна помощь! 


Неужели ни у кого нет идей?
Код

#include <windows.h>

int main()
{
    
    ShellExecute(NULL,TEXT("open"),TEXT("c:\\putty.exe"),TEXT(" -load \"COM1\""),NULL,SW_SHOWNORMAL);

    INPUT it[1];
    memset(it,0,sizeof(INPUT));
 
                 it[0].type = INPUT_KEYBOARD;
                 it[0].ki.wVk = VK_RETURN;
        
                    SendInput(1,it, sizeof(INPUT));
            
    
        return 0;
}




Автор: xvr 10.2.2011, 16:47
Попробуй добавить небольшие задержки между (и перед) SendInput

Добавлено @ 16:48
PS. Кстати - а где второй вызов SendInput с KEYEVENTF_KEYUP?

Автор: winsent7 11.2.2011, 11:50

Цитата

Попробуй добавить небольшие задержки между (и перед) SendInput

Да, теперь все работает как надо - Sleep() перед  SendInput, 
Спасибо всем!  

Цитата

PS. Кстати - а где второй вызов SendInput с KEYEVENTF_KEYUP?

без этого работает, кстати , почему?



Автор: xvr 11.2.2011, 12:46
Цитата(winsent7 @  11.2.2011,  11:50 Найти цитируемый пост)
без этого работает, кстати , почему?
Сильно зависит от приложения, кому отправляют SendInput. Некоторые могут игнорировать события отпускания кнопок (скорее даже - почти все игнорируют), а некоторые могут ловить. Так что лучше все же их посылать (для надежности)


Автор: winsent7 11.2.2011, 15:11
xvr, спасибо за ответы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)