Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание процесса в WinAPI, Winapi, абстрактный класс 
:(
    Опции темы
russians
Дата 10.1.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



Добрый день, дорогие софорумчане.

Есть задачка: мне нужно написать абстрактный класс для создания процесса в памяти с возможностями дальнейшего управления его состоянием. 

Дайте, пожалуйста, мат. части для закурки по процессам smile Или кусочки кода, если такая задача уже имела решения у кого нибудь  smile 

Буду крайне благодарен smile

Это сообщение отредактировал(а) russians - 10.1.2009, 20:21
PM MAIL   Вверх
russians
Дата 11.1.2009, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



Вот что получилось в результате:

Код

class AbstractProcessCreator
{
    public:
        virtual size_t process_function( std::wstring, std::wstring, size_t) = 0;
        void pause_process_function(void) = 0;
        size_t destroy_process_function(void) = 0;
    private:
        size_t iReturnVal;
        wchar_t * pwszParam;
        PROCESS_INFORMATION piProcessInfo;
        STARTUPINFOW siStartupInfo;

};

size_t AbstractProcessCreator::process_function(std::wstring FullPathToExe, std::wstring Parameters, size_t SecondsToWait)
{
    size_t iMyCounter = 0, iPos = 0;
    DWORD dwExitCode = 0;

    std::wstring sTempStr = L"";

    if (Parameters.size() != 0)
     {
          if (Parameters[0] != L' ')
          {
               Parameters.insert(0,L" ");
          }
     }

     sTempStr = FullPathToExe;
     iPos = sTempStr.find_last_of(L"\\");
     sTempStr.erase(0, iPos +1);
     Parameters = sTempStr.append(Parameters);

     wchar_t * pwszParam = new wchar_t[Parameters.size() + 1];

     if (pwszParam == 0)
     {
          return 1;
     }

    const wchar_t* pchrTemp = Parameters.c_str();
    wcsncpy(pwszParam, pchrTemp, Parameters.size() + 1);



    memset(this->&siStartupInfo, 0, sizeof(this->siStartupInfo));
    memset(&this->piProcessInfo, 0, sizeof(this->piProcessInfo));
    this->siStartupInfo.cb = sizeof(this->siStartupInfo);

    if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), pwszParam, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, 0, 0, &siStartupInfo, &piProcessInfo) != false)
    {
        dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
    }
    else
    {
        this->iReturnVal = GetLastError();
    }
    pwszParam = this->pwszParam;
    return this->iReturnVal;
}

size_t AbstractProcessCreator::destroy_process_function(void)
{
     delete[] this->pwszParam;
     this->pwszParam = 0;

     CloseHandle(this->piProcessInfo.hProcess);
     CloseHandle(this->piProcessInfo.hThread);

     return this->iReturnVal;
}


Вопрос: в правильном ли я направлении двигаюсь? Если нет, то какие есть ошибки? smile

И ещё: какие ещё в WinAPI есть возможности управления процессами, кроме создания/удаления?
Кажется, их можно ещё приостанавливать?

Это сообщение отредактировал(а) russians - 11.1.2009, 03:50
PM MAIL   Вверх
DominiK
Дата 11.1.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

Репутация: нет
Всего: нет



Абстрактные классы по идее могут быть только родительским классом для других классов. Наследуй класс от AbstractProcessCreator и вперед.

Код

class AbstractProcessCreator
{
    public:
        virtual size_t process_function( std::wstring, std::wstring, size_t) = 0;
        void pause_process_function(void) = 0;
        size_t destroy_process_function(void) = 0;
};


Код

class someclass : public AbstractProcessCreator
{
public:
     someclass();
     ~someclass();
     size_t process_function( std::wstring, std::wstring, size_t);
     void pause_process_function(void) ;
     size_t destroy_process_function(void);
private:
        size_t iReturnVal;
        wchar_t * pwszParam;
        PROCESS_INFORMATION piProcessInfo;
        STARTUPINFOW siStartupInfo;
};
Ну и реализуй. А в AbstractProcessCreator убери реализацию методов, и всё что находится в разделе private. Если я правильно задание понял...


Это сообщение отредактировал(а) DominiK - 11.1.2009, 12:09
PM MAIL   Вверх
russians
Дата 11.1.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 6.11.2006

Репутация: нет
Всего: нет



DominiK, я просто видел на одном из форумов реализацию абстрактного класса таким образом:

Код

class somebody
{
 public:
     virtual void function(void) = 0;
}

somebody::function(void)
{
    //somebody;
}


Верна ли такая реализация метода?
PM MAIL   Вверх
DominiK
Дата 11.1.2009, 13:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

Репутация: нет
Всего: нет



Цитата(russians @ 11.1.2009,  12:19)
DominiK, я просто видел на одном из форумов реализацию абстрактного класса таким образом:

Код

class somebody
{
 public:
     virtual void function(void) = 0;
}

somebody::function(void)
{
    //somebody;
}


Верна ли такая реализация метода?

нет, даже само по себе = 0; говорит об отсутствии реализации по крайней мере в данном классе smile 
И нельзя сделать конструктор виртуальным, только деструкторы

Это сообщение отредактировал(а) DominiK - 11.1.2009, 13:18
PM MAIL   Вверх
maxim1000
Дата 11.1.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата(DominiK @  11.1.2009,  13:17 Найти цитируемый пост)
нет, даже само по себе = 0; говорит об отсутствии реализации по крайней мере в данном классе

=0 говорит о том, что в наследниках нужно переопределить эту функцию
а реализация вполне может присутствовать
более того, в случае десруктора она обязана присутствовать...


--------------------
qqq
PM WWW   Вверх
DominiK
Дата 11.1.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 11.3.2007
Где: Россия, Омск

Репутация: нет
Всего: нет



Цитата(maxim1000 @ 11.1.2009,  18:59)
Цитата(DominiK @  11.1.2009,  13:17 Найти цитируемый пост)
нет, даже само по себе = 0; говорит об отсутствии реализации по крайней мере в данном классе

=0 говорит о том, что в наследниках нужно переопределить эту функцию
а реализация вполне может присутствовать
более того, в случае десруктора она обязана присутствовать...


Да да...вспомнил, пардон smile 

Это сообщение отредактировал(а) DominiK - 12.1.2009, 12:35
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0944 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.