Вот что получилось в результате:
| Код | 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; }
|
Вопрос: в правильном ли я направлении двигаюсь? Если нет, то какие есть ошибки? 
И ещё: какие ещё в WinAPI есть возможности управления процессами, кроме создания/удаления? Кажется, их можно ещё приостанавливать? |