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


Автор: russians 10.1.2009, 20:20
Добрый день, дорогие софорумчане.

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

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

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

Автор: russians 11.1.2009, 03:36
Вот что получилось в результате:

Код

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 есть возможности управления процессами, кроме создания/удаления?
Кажется, их можно ещё приостанавливать?

Автор: DominiK 11.1.2009, 12:01
Абстрактные классы по идее могут быть только родительским классом для других классов. Наследуй класс от 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. Если я правильно задание понял...

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

Код

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

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


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

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

Код

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

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


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

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

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

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

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

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


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

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