OpenThread und weiter ?
-
hi zusammen,
ich will ein prog schreiben mit einem menü in dem dynamisch aus einer db
exefiles eingetragen werden und durch den nutzer auszuwählen sind.
nun soll wenn der nutzer eine exe gestartet hat und den eintrag wieder auswählt der process weitergeführt werden.
also der process wieder in den vordergrund geholt werden wie bei alt+tab
nun mein problem:
ich kann mir die threadID merken aber dann scheiterts
wie kann ich weiter vorgehen ?
hier ein bißchen code//--------------------------------------------------------------------------- bool __fastcall TMenuManager_c::StartThread(MenuManagerDB_c::TPROCESS_c pProc) { bool res = false; TTHREAD_PARAM_c *pParams = new TTHREAD_PARAM_c(); AnsiString FileName = pParams->processPath + pParams->processName; if (FileExists(FileName)) { if (pProc.arguments_valid) pParams->arguments = pProc.arguments; else pParams->arguments = ""; m_pOpenProcs = new TOPEN_PROCESSES_c; DWORD mThreadID; HANDLE hThreadRef = CreateThread(NULL, // no security attributes 0, // use default stack size StartProcess, // thread function pParams , // argument to thread function 0, // use default creation flags &mThreadID);// returns the thread identifier if (hThreadRef != NULL) { m_pOpenProcs->Name = pParams->Name; m_pOpenProcs->processName = pParams->processName; m_pOpenProcs->processPath = pParams->processPath; m_pOpenProcs->dwThreadID = mThreadID; m_vOpenProcs.push_back(m_pOpenProcs); res = true; m_vThreadID.push_back(hThreadRef); } else res = false; } return res; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- DWORD WINAPI TMenuManager_c::StartProcess(LPVOID pParam) { STARTUPINFO StartInfo; PROCESS_INFORMATION ProcInfo; DWORD pid = 0; DB_ACTION_e dbAction = eDB_ACTION_INSERT; memset(&ProcInfo, 0, sizeof(ProcInfo)); memset(&StartInfo, 0 , sizeof(StartInfo)); StartInfo.cb = sizeof(StartInfo); // Set structure size TTHREAD_PARAM_c *pThreadPar = (TTHREAD_PARAM_c *)pParam; AnsiString exefile = pThreadPar->processPath + pThreadPar->processName; AnsiString arguments = exefile + " " + pThreadPar->arguments; int res = CreateProcess(NULL, arguments.c_str(), NULL, NULL, NULL, NULL, NULL, NULL, &StartInfo, &ProcInfo); if (res) { pid = ProcInfo.dwProcessId; if (pid > 0) { try { TDatabaseIntf(dbAction, m_pStartedProcess, pMenuManagerDB); dbAction = eDB_ACTION_UPDATE; } catch (...) { ; } // wait forever for process to finish WaitForSingleObject(ProcInfo.hThread, INFINITE); } } // if (res) else { // start of process failed } delete pThreadPar; return 0; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- bool __fastcall TMenuManager_c::OpenProc(AnsiString Name) { bool res = true; HANDLE hThread; m_vOpenProcs = getOpenProcesses(); OpenProcVector::iterator ProcIter = m_vOpenProcs.begin(); while (ProcIter != m_vOpenProcs.end()) { if (Name == (*ProcIter)->Name) { hThread = OpenThread(THREAD_ALL_ACCESS , false, (*ProcIter)->dwThreadID); } ProcIter++; } return res; }