JP29
JP29

Reputation: 625

Executing dos commands with Borland C++ and saving output

New to C++.

I have been looking most of the afternoon, does anyone know a simple way to execute DOS commands and save to a variable for a windows forms application?

Upvotes: 0

Views: 7445

Answers (3)

mh taqia
mh taqia

Reputation: 3586

bool execDosCommand(char *command, AnsiString &output)
{
    SECURITY_ATTRIBUTES sa;
    ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle=true;
    sa.lpSecurityDescriptor=NULL;
    HANDLE ReadPipeHandle;
    HANDLE WritePipeHandle;       // not used here

    if(!CreatePipe(&ReadPipeHandle, &WritePipeHandle, &sa, 0))
        return false;

    STARTUPINFOA si;
    ZeroMemory(&si,sizeof(STARTUPINFO));
    si.cb=sizeof(STARTUPINFO);
    si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow=SW_HIDE;
    si.hStdOutput=WritePipeHandle;
    si.hStdError=WritePipeHandle;

    PROCESS_INFORMATION pi;
    ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    text cmd;
    cmd.print("/c %s", command);
    char pathbuf[MAX_PATH];
    _searchenv("CMD.EXE", "PATH", pathbuf);
    if(!CreateProcessA(pathbuf, cmd.t_str(), NULL, NULL, true, 0, NULL, NULL, &si, &pi))
        return false;
    char Data[1024];
    for (;;)
    {
        DWORD BytesRead;
        DWORD TotalBytes;
        DWORD BytesLeft;

        if(!PeekNamedPipe(ReadPipeHandle,Data,sizeof(Data),&BytesRead, &TotalBytes,&BytesLeft)) return false;
        if(BytesRead)
        {
            if(!ReadFile(ReadPipeHandle,Data,sizeof(Data)-1,&BytesRead,NULL))
                return false;
            Data[BytesRead]='\0';
            output += Data;
        }
        else
        {
            if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)
                break;
        }
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(ReadPipeHandle);
    CloseHandle(WritePipeHandle);
    return true;
}

for example: execDosCommand("dir C:\", output);

Upvotes: 1

Roin
Roin

Reputation: 53

as roymustang mentioned, you can use the system command to execute another command from the system. This could be a batch script for example that pipes the output of the command into a text file. You can then read the text file to actually get the information. The Problem you have with "returning" the command output is, how does the command output look like? In what data structure would you store it? Most of the time you'll get a bunch of unformatted text, which can't be parsed to easily so there is no real generic way to return the output of an application or script into a C++ data structure.

You might as well want to take a look here: http://docwiki.embarcadero.com/RADStudio/en/System,_wsystem

Like described above I don't believe there is a way to return the output of an application call to your program, at least none that I ever heard about.

Greets,

Florian

Upvotes: 0

roymustang86
roymustang86

Reputation: 8553

You can use system("dir"); . This will bring up the command prompt and run the dir command.

Alternatively you can use WinExec.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms687393(v=vs.85).aspx

You can make the command to redirect to a text file, and read off of it.

Upvotes: 2

Related Questions