В одном из моих проектов я создаю несколько процессов (которые являются подпроектами, которые я разработал) из моего основного проекта как CREATE_SUSPENDED и сохраняю их дескрипторы в глобальном массиве, но;когда я хочу возобновить его с функцией ResumeThread , я получаю ERROR_INVALID_HANDLE код ошибки.
В MSDN указано, что поток должен иметь право доступа THREAD_SUSPEND_RESUME, и я не смог найти способ его установки.
Эти дескрипторы действительны только в своем пространстве процессаи как я могу приостановить / возобновить поток или процесс из другого процесса со всеми дескрипторами, которые я сохранил?
Примечание: я знаю, что здесь могут быть полезны объекты синхронизации, но это единственный и единственный способ?
Еще одна проблема;Как получить дескриптор потока, созданного моим ProcessClass из основного процесса, который также создал этот ProcessClass?
Вот часть кода
ProcessClass
void ProcessClass::Start(){
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
BOOL createdProc = CreateProcess(NULL,
ProcessExeDir,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE | CREATE_SUSPENDED
, NULL,
NULL,
&si,
&pi);
if (createdProc == FALSE)
{
UINT32 errorCode = GetLastError();
}
else
{
DWORD affinity;
affinity = 0x000000010 << (5);
SetProcessAffinityMask(pi.hProcess, affinity);
ProcessHandler = pi.hProcess;
ProcessInfoPtr->ProcHandle = ProcessHandler;
// I can need this handle
// CloseHandle(pi.hThread);
}
}
// ProcessInPtr is defines as ProcessInfoStc* in the header
ProcessInfoStc* ProcessClass::GetProcessInfoPtr() {
return ProcessInfoPtr;
}
В основном проекте:
int main() {
// this is declared as ManageProcesses(const ProcessInfoStcPtr& processes)
ManageProcesses(ProcessInfoArray);
return 0;
}
В функции ManageProcess, которая находится в том же проекте lib с ProcessClass и следующими определениями структуры:
ProcessClass processObj = new ProcessClass();
processObj->Start();
...
HANDLE pHandle = processObj->GetProcessInfoPtr()->ProcHandle;
//! pHandle is is same with the created process handle as I debug
ResumeThread(pHandle);
DWORD error = GetLastError(); // RETURNS INVALID HANDLE
И структура для хранения такжев основном процессе
ProcessInfoStc {
HANDLE ProcHandle ,
DWORD ProcId..
}
ProcessInfoStc ProcessInfoArray[10] = {
{
0,0...
},...
}
typedef ProcessInfoStc* ProcessInfoStcPtr;