CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3
  1. #1
    Join Date
    Apr 2003
    Posts
    100

    Runing console application from MFC-SDI

    Hello,
    I have to run a console application (nmkae.exe, cl.exe, link.exe) from an MFC-SDI application (Visual Studio 6.0). I tried doing it it using CreateProcess, ShellExecute and system.
    The console application prints some error messages on the console window and quits.
    How can I save those error messages ?
    I tried doing it using:
    system ("nmake > log.txt")
    I expected to get the following message in log.txt:
    Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
    Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

    NMAKE : fatal error U1064: MAKEFILE not found and no target specified
    Stop.

    C:\Documents and Settings\Owner>

    But the file was empty.

    Can you help ?
    Thanks.

  2. #2
    Join Date
    Jan 2008
    Location
    India
    Posts
    408

    Re: Runing console application from MFC-SDI

    Hi

    To take a log of a console application, you have to run the application in a child process which you have to create. After the execution, the details of the execution will be dumped in a readpipe. You have to extract the contents and display. The following piece of code might be helpful for you.

    Code:
    const int BUFFLENGTH = 255;
     
    m_status.SetWindowText("Please wait...");
     
    PROCESS_INFORMATION proc;
     
    STARTUPINFO start;
     
    SECURITY_ATTRIBUTES sa;
     
    HANDLE hReadPipe,hWritePipe;
     
    //fill memory with zeros
     
    ZeroMemory(&start,sizeof(start));
     
    //initialize security attributes
     
    sa.bInheritHandle=TRUE;
     
    sa.nLength=sizeof(sa);
     
    sa.lpSecurityDescriptor=NULL;
     
     
     
    //fill memory with zeros
     
    ZeroMemory(&proc,sizeof(proc));
     
     
     
    //create pipe with read and write handles
     
    if(!CreatePipe(&hReadPipe,&hWritePipe,&sa,0))
     
    {
     
    MessageBox("Cannot create pipe");
     
    m_status.SetWindowText("Cannot create pipe");
     
    return;
     
    }
     
    //init start
     
    start.cb=sizeof(start);
     
    start.dwFlags = STARTF_USESTDHANDLES;
     
    start.hStdOutput = hWritePipe;
     
    start.hStdError = hWritePipe;
     
    start.wShowWindow = SW_HIDE;
     
    char pPath[255];
     
    m_process.GetWindowText(pPath,255);
     
    if(!CreateProcess(NULL,pPath,&sa,&sa,TRUE,NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&start,&proc))
     
    {
     
    MessageBox("Cannot create process");
     
    m_status.SetWindowText("Cannot create process");
     
    return;
     
    }
     
    CString outputText;
     
    //close handles
     
    CloseHandle(hWritePipe);
     
    //produce log
     
    DWORD bytesread;
     
    BOOL bSuccess;
     
    int bytestoread = BUFFLENGTH;
     
    char mybuff[BUFFLENGTH]="";
     
    do 
     
    {
     
    bSuccess = 0;
     
    strcpy(mybuff,"");
     
    bSuccess = ReadFile(hReadPipe,mybuff, bytestoread, &bytesread, NULL);
     
    if (bSuccess && bytesread)
     
    {
     
    for(unsigned int i=0; i<bytesread; i++)
     
    {
     
    outputText += mybuff[i];
     
    }
     
    }
     
    }
     
    while (bytesread && bSuccess);
     
     
     
    DWORD WaitReturnCode;
     
    WaitReturnCode=WaitForSingleObject(proc.hProcess,INFINITE);
     
    m_status.SetWindowText("");
     
     
     
    //return status
     
    switch(WaitReturnCode)
     
    {
     
    case WAIT_ABANDONED:
     
    MessageBox("Process Abandoned");
     
    m_status.SetWindowText("Process Abandoned");
     
    break;
     
    case WAIT_OBJECT_0:
     
    m_status.SetWindowText("Process completed");
     
    break;
     
    case WAIT_TIMEOUT:
     
    MessageBox("Process timedout");
     
    m_status.SetWindowText("Process Timedout");
     
    break;
     
    default:
     
    ;
     
    }
     
    //close remaining handles
     
    CloseHandle(hReadPipe);
     
    CloseHandle(proc.hThread);
     
    CloseHandle(proc.hProcess);
     
    //generate log file for the operation
     
    char lPath[255];
     
    m_log.GetWindowText(lPath,255);
     
    CFile logFile;
     
    logFile.Open(lPath,CFile::modeCreate|CFile::modeWrite);
     
    logFile.Write(outputText,outputText.GetLength());
     
    logFile.Close();
    


    This is actually a part of an MFC application which creates a process and generates a log. The string pPath is the path of the console application executable. And the string lPath is the path of your log file.
    Attached Files Attached Files
    Rate the posts which you find useful

  3. #3
    Join Date
    Apr 2003
    Posts
    100

    Re: Runing console application from MFC-SDI

    Quote Originally Posted by ajbharani
    Hi

    To take a log of a console application, you have to run the application in a child process which you have to create. After the execution, the details of the execution will be dumped in a readpipe. You have to extract the contents and display. The following piece of code might be helpful for you.

    Code:
    const int BUFFLENGTH = 255;
     
    m_status.SetWindowText("Please wait...");
     
    PROCESS_INFORMATION proc;
     
    STARTUPINFO start;
     
    SECURITY_ATTRIBUTES sa;
     
    HANDLE hReadPipe,hWritePipe;
     
    //fill memory with zeros
     
    ZeroMemory(&start,sizeof(start));
     
    //initialize security attributes
     
    sa.bInheritHandle=TRUE;
     
    sa.nLength=sizeof(sa);
     
    sa.lpSecurityDescriptor=NULL;
     
     
     
    //fill memory with zeros
     
    ZeroMemory(&proc,sizeof(proc));
     
     
     
    //create pipe with read and write handles
     
    if(!CreatePipe(&hReadPipe,&hWritePipe,&sa,0))
     
    {
     
    MessageBox("Cannot create pipe");
     
    m_status.SetWindowText("Cannot create pipe");
     
    return;
     
    }
     
    //init start
     
    start.cb=sizeof(start);
     
    start.dwFlags = STARTF_USESTDHANDLES;
     
    start.hStdOutput = hWritePipe;
     
    start.hStdError = hWritePipe;
     
    start.wShowWindow = SW_HIDE;
     
    char pPath[255];
     
    m_process.GetWindowText(pPath,255);
     
    if(!CreateProcess(NULL,pPath,&sa,&sa,TRUE,NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&start,&proc))
     
    {
     
    MessageBox("Cannot create process");
     
    m_status.SetWindowText("Cannot create process");
     
    return;
     
    }
     
    CString outputText;
     
    //close handles
     
    CloseHandle(hWritePipe);
     
    //produce log
     
    DWORD bytesread;
     
    BOOL bSuccess;
     
    int bytestoread = BUFFLENGTH;
     
    char mybuff[BUFFLENGTH]="";
     
    do 
     
    {
     
    bSuccess = 0;
     
    strcpy(mybuff,"");
     
    bSuccess = ReadFile(hReadPipe,mybuff, bytestoread, &bytesread, NULL);
     
    if (bSuccess && bytesread)
     
    {
     
    for(unsigned int i=0; i<bytesread; i++)
     
    {
     
    outputText += mybuff[i];
     
    }
     
    }
     
    }
     
    while (bytesread && bSuccess);
     
     
     
    DWORD WaitReturnCode;
     
    WaitReturnCode=WaitForSingleObject(proc.hProcess,INFINITE);
     
    m_status.SetWindowText("");
     
     
     
    //return status
     
    switch(WaitReturnCode)
     
    {
     
    case WAIT_ABANDONED:
     
    MessageBox("Process Abandoned");
     
    m_status.SetWindowText("Process Abandoned");
     
    break;
     
    case WAIT_OBJECT_0:
     
    m_status.SetWindowText("Process completed");
     
    break;
     
    case WAIT_TIMEOUT:
     
    MessageBox("Process timedout");
     
    m_status.SetWindowText("Process Timedout");
     
    break;
     
    default:
     
    ;
     
    }
     
    //close remaining handles
     
    CloseHandle(hReadPipe);
     
    CloseHandle(proc.hThread);
     
    CloseHandle(proc.hProcess);
     
    //generate log file for the operation
     
    char lPath[255];
     
    m_log.GetWindowText(lPath,255);
     
    CFile logFile;
     
    logFile.Open(lPath,CFile::modeCreate|CFile::modeWrite);
     
    logFile.Write(outputText,outputText.GetLength());
     
    logFile.Close();
    


    This is actually a part of an MFC application which creates a process and generates a log. The string pPath is the path of the console application executable. And the string lPath is the path of your log file.
    Thanks !

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured