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;
    }
    

Anmelden zum Antworten