views:

327

answers:

2

Hi, I'm creating a process and making a lot of kernel objects requisition to the system. My code is that:

int main(){
    //Cria processo para o Data Viewer Unit
     LPSTARTUPINFOA si;
    PROCESS_INFORMATION pi;

    // Start the child process. 
    if(!CreateProcessA( 
       "E:\\Documents\\Faculdade\\Matérias\\Automação em Tempo Real\\TP 3\\DataViewerUnit\\Debug\\DataViewerUnit.exe", // Module name
       NULL,         // Command line
       NULL,         // Process handle not inheritable
       NULL,         // Thread handle not inheritable
       FALSE,        // Set handle inheritance to FALSE
       CREATE_NEW_CONSOLE,   // No creation flags
       NULL,         // Use parent's environment block
       NULL,         // Use parent's starting directory 
       si,          // Pointer to STARTUPINFO structure
       &pi )         // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return 0;
    }

  // Wait until child process exits.
  WaitForSingleObject( pi.hProcess, INFINITE );

    LOG("Traffic System initiating...");
    LOG("Keyboard commands:\n"
     "0    - Changes the system mode to manual.\n"
     "1    - Changes the system mode to automatic.\n"
     "Spacebar - Swaps between buffer lock and unlock.\n"
     "ESC   - Terminates the program."
     );

    system("PAUSE");
    isAutoMode = TRUE;
    terminate_progam = FALSE;
    terminate_TOU = FALSE;
    bufferSpace = BUFFER_SIZE;
    InitializeCriticalSection(&bufferCS);
    system("PAUSE");
    hMailslot = CreateFile(MAILSLOT, GENERIC_WRITE, FILE_SHARE_READ, 
     NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    ASSERT(hMailslot, "Mailslot couldn't be created");

    hHasPosition = CreateSemaphore(NULL, BUFFER_SIZE, BUFFER_SIZE, 
     (LPCWSTR)"HAS_POSITION");
    ASSERT(hHasPosition, "Positions to write semaphore couldn't be created.");

    hHasMsg = CreateSemaphore(NULL, 0, BUFFER_SIZE, (LPCWSTR)"HAS_MSG");
    ASSERT(hHasMsg, "Messages to read semaphore couldn't be created.");

    hBufferLockStatus = CreateEvent(NULL, true, true, 
     (LPCWSTR)"BUFFER_LOCK_STATUS");
    ASSERT(hBufferLockStatus, "Lock status semaphore couldn't be created.");

    hTimer = CreateSemaphore(NULL, 0, 1, (LPCWSTR)"REMOTE_UNITS_TIMER");
    ASSERT(hTimer, "Timer semaphore couldn't be created.");

    nextMsgToRead = 0;
    nextPositionToWrite = 0;

    for (int i = 0;i < RU_QUANTITY;i++) {
     hRUs[i] = (HANDLE) _beginthreadex(NULL, 0, (CAST_FUNCTION)RUAction, (LPVOID)i, 0, NULL);
     ASSERT(hRUs[i], "RU " << i << "could not be created.");
     DEBUG("RU " << i << " created.");
     RUTime[i] = generateTime(100, 200);
    DEBUG("Remote Unit " << i << " interval: " <<
     RUTime[i]);
    }

    HANDLE hTOU = (HANDLE) _beginthreadex(NULL, 0, (CAST_FUNCTION)TOUAction, NULL, 0, NULL);
    ASSERT(hTOU, "Traffic Optimization Unit couldn't be created.");

    bool isLocked = false;
    int typed;
    do{
     typed = _getch();
     switch(typed){
     case CHAR0:   
      if(isAutoMode)
       LOG("You changed the mode to manual.")
      else
       LOG("Mode is already manual.")
       isAutoMode = false;
      break;
     case CHAR1:   
      if(!isAutoMode)
       LOG("You changed the mode to automatic.")
      else
       LOG("Mode is already automatic.")
      isAutoMode = true;
      break;
     case SPACEBAR :
      if(isLocked){
       isLocked = false;
       SetEvent(hBufferLockStatus);
       LOG("You unlocked the buffer.");
      } else {
       isLocked = true;
       ResetEvent(hBufferLockStatus);
       LOG("You locked the buffer.");
      }
      break;
     Default:
      break;
     }
    } while (typed!=ESC);
    LOG("You typed ESC, the program will be finished.");
    //Pede o fim das threads

    terminate_progam = true;
    // Importante para que as threads não fiquem 
    // travadas sem poder terminar.
    SetEvent(hBufferLockStatus);
    WaitForMultipleObjects(RU_QUANTITY, hRUs, TRUE, INFINITE);
    terminate_TOU = true;
    WaitForSingleObject(hTOU, INFINITE);


    // Close process and thread handles. 
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
    CloseHandle(hHasMsg);
    CloseHandle(hHasPosition);
    CloseHandle(hBufferLockStatus);
    CloseHandle(hTimer);

    return 0;
}

I have commented almost of all this code and the create process runs ok. When I left more than 1 kernel object, the program stop to run and windows vista shows a message of "This program stop to run...". The other process has just a cout saying something...

I would like to know what is wrong with my code. Regards, Leandro Lima

+1  A: 

Use zeromemory or memset and initialize your ProcessInfo and StartupInfo

This is declaring a pointer to a startup info struct declare the struct the and pass it in by reference LPSTARTUPINFOA si

set si.cb = sizeof(STARTUPINFO)

Something Like this

PROCESS_INFORMATION PI;
STARTUPINFO SI;   
SI.dwFlags =  STARTF_USESTDHANDLES;
SI.cb = sizeof(STARTUPINFO);
char * sCommandLine = _strdup(sCommand.c_str());
if(!CreateProcess(NULL,sCommandLine,NULL,NULL,true,CREATE_NO_WINDOW,NULL,NULL,&SI,&PI))
rerun
It still stops to work. sCommandLine, I neede to cast with (LPCWSTR).
Leandro
Now I put it in my code ://Cria processo para o Data Viewer UnitPROCESS_INFORMATION pi;STARTUPINFO si; si.dwFlags = STARTF_USESTDHANDLES;si.cb = sizeof(STARTUPINFO);char * sCommandLine = _strdup("E:\\Documents\\Faculdade\\Matérias\\Automação em Tempo Real\\TP 3\\DataViewerUnit\\Debug\\DataViewerUnit.exe");// Start the child process. if(!CreateProcess( (LPCWSTR)sCommandLine, // Module ...but it is still wrong.
Leandro
Thanks, I put that part of zeromemory and it works.
Leandro
I tend to write this more concisely as `STARTUPINFO SI = {sizeof STARTUPINFO };`. This zeroes all other fields. Works for all Windows structures that are length-prefixed but should be 0 otherwise.
MSalters
+2  A: 

You're passing an uninitialized pointer to a STARTUPINFO structure. You need to declare a STARTUPINFO structure, initialize its fields, and pass a pointer to it.

interjay
how to initialize it?
Leandro