0

C++ の初心者。

私は午後のほとんどを探していましたが、DOS コマンドを実行して Windows フォーム アプリケーションの変数に保存する簡単な方法を知っている人はいますか?

4

3 に答える 3

2

を使用できますsystem("dir");。これにより、コマンドプロンプトが表示され、dirコマンドが実行されます。

または、WinExecを使用することもできます。

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

テキストファイルにリダイレクトするコマンドを作成し、それを読み取ることができます。

于 2012-07-11T13:52:10.203 に答える
1
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;
}

例: execDosCommand("dir C:\", output);

于 2012-07-19T19:19:28.263 に答える
0

ロイムスタングが述べたように、システムコマンドを使用して、システムから別のコマンドを実行できます。これは、たとえば、コマンドの出力をテキスト ファイルにパイプするバッチ スクリプトである可能性があります。その後、テキスト ファイルを読み取って、実際に情報を取得できます。コマンド出力を「返す」ことに関する問題は、コマンド出力がどのように見えるかということです。どのデータ構造に保存しますか? ほとんどの場合、フォーマットされていないテキストが大量に生成されますが、これらは簡単に解析できないため、アプリケーションまたはスクリプトの出力を C++ データ構造に返す一般的な方法はありません。

こちらもご覧ください: http://docwiki.embarcadero.com/RADStudio/en/System,_wsystem

上記のように、アプリケーション呼び出しの出力をプログラムに返す方法があるとは思いません。少なくとも、私が聞いたことはありません。

はじめまして、

フロリアン

于 2012-07-11T15:13:28.077 に答える