2016-04-01 1 views
1
bool execute() 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    bool flag = true; 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 
    string f = "dir desktop" 
    if (CmdLine.parameter != "") 
    { 
     LPSTR l1 = const_cast<char *>(f.c_str()); 
     CreateProcess(NULL, l1, NULL, NULL, false, 0, NULL, NULL, &si, &pi); 
     flag = true; 
     // WaitForSingleObject(pi.hProcess, INFINITE); 

     // // Close process and thread handles. 
     // CloseHandle(pi.hProcess); 
     // CloseHandle(pi.hThread); 
     //} 
    } 
    return flag; 
} 

Я пытаюсь запустить команду cmd визуальной студией. Я использую createprocces (API), чтобы запустить эту вещь , но я не могу понять, почему она ничего не запускает.пытается запустить commend на cmd throw C++ с помощью createprocces (API)?

+0

Почему 'flag' установлен в' true' в двух местах и ​​никогда не 'false'? –

ответ

0

Если вы вызываете CreateProcess() с первым параметром, установленным в NULL, то вы должны убедиться, что l1 начинается с имени модуля для вызова.

Поскольку dir является внутренней командой командного процессора, а не исполняемым, вы должны использовать cmd в качестве имени модуля и указать остальную часть параметра as cmd expects them.

Так попробуйте следующее:

string f = "cmd /c=dir desktop"; 
1

dir является команда, понимаемая cmd.exe, это не программа, которую можно выполнить.

Вы можете попробовать команду cmd /k "dir desktop", правильно выраженную как строка C++.

Е.Г.,

auto execute() 
    -> bool 
{ 
    STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi = {}; 
    string f = "cmd /k \"dir desktop\"\0"; 
    bool const ok = !!CreateProcess(0, &f[0], 0, 0, false, 0, 0, 0, &si, &pi); 
    if(!ok) { return false; } 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
    return true; 
} 

Обратите внимание, как звонки на ZeroMemory были заменены инициализации C++.

Просто позвольте компилятору выполнить свою работу, вы получите более короткий, более четкий код, который более правдоподобен и столь же эффективен (возможно, больше). Выиграйте выигрышную победу.

Отказ от ответственности: код не рассматривается компилятором.


Если намерение состоит в том, чтобы просмотреть содержимое папки рабочего стола пользователя, то обратите внимание, что dir desktop не делает этого. В качестве интерактивной команды в интерпретаторе команд вы можете использовать dir %userprofile%\desktop, а также работать в диалоговом окне «Запуск Windows». В зависимости от поведения командного интерпретатора для аргументов командной строки он может работать напрямую через CreateProcess или нет.


Как правило, при использовании функции уровня API Windows, то предпочтительнее использовать функции основанное текст на основе wchar_t, т.е. определить UNICODE перед включением <windows.h> (или использовать ...W функции в явном виде).