Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Вызов приложения


Автор: VampirDX 3.11.2007, 04:46
Есть такой вот код:
Код

#include <windows.h>
#include <iostream>

using namespace std;

void main()
{
    char a;
    STARTUPINFO startin;
    PROCESS_INFORMATION pi;
    ZeroMemory (&startin, sizeof(STARTUPINFO));
    cout<<"What program do you need?"<<endl;
    cout<<"Please, enter the number:"<<endl;
    cout<<"                          1 - Internet Explorer"<<endl;
    cout<<"                          2 - Notepad"<<endl;
    cout<<"                          3 - run both programms"<<endl;
    cin>>a;
    switch ( a )
    {
    case '1':
        CreateProcess ("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    case '2':
        CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    case '3':
        CreateProcess ("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    default:
        break;
    }
}


прога вызывает IE или блокнот по запросу. Нужно добавить кусок, который позволял бы закрывать приложение в нужный нам момент, то есть, когда мы захотим smile
подскажите плз

Автор: Evjeny 3.11.2007, 10:58
Цитата(VampirDX @  3.11.2007,  04:46 Найти цитируемый пост)
Нужно добавить кусок, который позволял бы закрывать приложение в нужный нам момент, то есть, когда мы захотим 


Т.е., насколько я понял, необходимо закрывать приложение по нажатию какой-нибудь определенной клавиши. Если так, то:

Код

#include <iostream>

using namespace std;

#include <windows.h>
#include <conio.h>

int main()
{
    char a;
    STARTUPINFO startin;
    PROCESS_INFORMATION pi, pi1;
    int term = 0;

    ZeroMemory (&startin, sizeof(STARTUPINFO));
    cout<<"What program do you need?"<<endl;
    cout<<"Please, enter the number:"<<endl;
    cout<<"                          1 - Internet Explorer"<<endl;
    cout<<"                          2 - Notepad"<<endl;
    cout<<"                          3 - run both programms"<<endl;
    cin>>a;
    switch ( a )
    {
    case '1':
        CreateProcess ("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    case '2':
        CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    case '3':
        CreateProcess ("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi1);
        break;
    default:
        break;
    }
    
    cout << "Do you want terminate the running process(es)? (press y for terminate): ";

    while(!term)
    {
        if(getche()=='y')
        {
            term = TerminateProcess(pi.hProcess, NULL);
            if(a=='3')
                term = TerminateProcess(pi1.hProcess, NULL);
        }
    }

    cout << endl;

    return 0;
}


Sorry for my bad english.  smile 

Автор: VampirDX 3.11.2007, 21:13
спасиб smile

Автор: VampirDX 4.11.2007, 00:22
нет, млин, поторопился. ошибку выдает, что:
необъявленная локальная переменная pi1.

Автор: Evjeny 5.11.2007, 10:36
Попробуй объявлять переменные pi и pi1 отдельно.

Вместо
Код

PROCESS_INFORMATION pi, pi1;


вот так
Код

PROCESS_INFORMATION pi;
PROCESS_INFORMATION pi1;

Автор: VampirDX 5.11.2007, 15:02
пробовал. не хочет.

Автор: Evjeny 5.11.2007, 15:40
В чем работаешь (среда, компилятор) и что конкретно за ошибка?

Автор: VampirDX 5.11.2007, 17:17
работаю на Visual Studio 2005
вот последний, пока, код
Код
#include <windows.h>
#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    int a;
    int term = 0;
    int getch(void);
    STARTUPINFO startin;
    PROCESS_INFORMATION pi;
    PROCESS_INFORMATION pi1;
    ZeroMemory (&startin, sizeof(STARTUPINFO));
    cout<<"What program do you need?"<<endl;
    cout<<"Please, enter the number:"<<endl;
    cout<<"                          1 - Internet Explorer"<<endl;
    cout<<"                          2 - Notepad"<<endl;
    cout<<"                          3 - run both programms"<<endl;
    cin>>a;
    switch ( a )
    {
    case '1':
        CreateProcess ("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    case '2':
        CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
    case '3':
        CreateProcess ("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi);
        break;
        }
    cout<<"Close?"<<endl;
    while(!term)
    {
        if(getch()=='y')
        {
            term = TerminateProcess(pi.hProcess, NULL);
            if(a=='3')
                term = TerminateProcess(pi1.hProcess, NULL);
        }
    }
    cout<<endl;

return 0;
}


выдавать ошибку о pi1 почему то перестал........ терь такую выдает:
error LNK2019: unresolved external symbol "int __cdecl getch(void)" (?getch@@YAHXZ) referenced in function _main

Автор: Optimus 5.11.2007, 20:12
Цитата(VampirDX @  5.11.2007,  17:17 Найти цитируемый пост)
int getch(void);

интересно,  и что это означает ? 
может надо убрать эту строку.

Автор: Evjeny 6.11.2007, 00:00
VampirDX, Optimus прав.
1. В данном случае строка
Цитата(VampirDX @  5.11.2007,  17:17 Найти цитируемый пост)
int getch(void);

не имеет никакого смысла. Чтобы использовать функцию getch() к программе необходимо подключить conio.h.
2. Если ты объявляешь переменную a типа int
Цитата(VampirDX @  5.11.2007,  17:17 Найти цитируемый пост)
int a;

то чтобы программа заработала правильно необходимо убрать в кейсах кавычки:
Код

switch ( a )
    {
    case 1:
       ...
    case 2:
        ...
    case 3:
        ...
        }

Соответсвенно в ветвлении if кавычки в условии тоже убираются:
Код

if(a==3)
                term = TerminateProcess(pi1.hProcess, NULL);

И последнее. При создании двух процессов, при втором вызове CreateProcess должна вызываться с параметром pi1, а не pi:
Код

CreateProcess ("C:\\WINDOWS\\system32\\notepad.exe",NULL,NULL,NULL,NULL,0,NULL,NULL,&startin,&pi1);

В противном случае второй вызов процедуры CreateProcess затрет содержимое структуры pi, созданной предыдущим вызовом CreateProcess, а структура pi1 останется не заполненной. Соответственно следующий код будет завершать только последний созданный процесс:
Код

if(getch()=='y')
        {
            term = TerminateProcess(pi.hProcess, NULL);
            if(a==3)
                term = TerminateProcess(pi1.hProcess, NULL);
        }


Автор: VampirDX 6.11.2007, 02:30
жжесть smile .... спасиб за разъяснения. терь все как по маслу smile 

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