2016-04-01 17 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; 
} 

Görsel stüdyo tarafından cmd komutunu çalıştırmaya çalışıyorum. Bu şeyi çalıştırmak için createprocces (API) kullanıyorum ama neden bir şey çalışmadığını anlayamıyorum.cmd throw C++ yerine createprocces (API) kullanarak çalışmayı denemeye çalışıyor?

+0

Neden "flag" iki yerde "true" ve "false" olarak ayarlanmıyor? –

cevap

0

CreateProcess()'u ilk parametre olarak NULL olarak ayarladıysanız, l1'un aranacak modül adıyla başladığından emin olmanız gerekir.

dir, komut işlemcisinin dahili bir komutudur ve yürütülebilir değil, cmd modül adı olarak kullanmak ve as cmd expects them parametresinin geri kalanını vermeniz gerekir.

Yani aşağıdakileri deneyin:

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

dircmd.exe tarafından anlaşılan bir komuttur, bu yürütebileceği bir program değil.

Uygun şekilde C++ dizesi olarak ifade edilen cmd /k "dir desktop" komutunu deneyebilirsiniz. ZeroMemory çağrıları C++ başlatma ile değiştirildiği nasıl Ör

,

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; 
} 

not edin.

Derleyicinin işini yapmasına izin vererek, daha kısa, daha net bir kod olan ve daha verimli olan (muhtemelen daha fazla) kod elde edersiniz. Kazan kazan kazan.

Yasal uyarı: kod derleyici tarafından incelenmedi. niyet kullanıcının masaüstü klasörünün içeriğini listelemek için ise


ardından dir desktop bunu unutmayın. Komut yorumlayıcısında interaktif bir komut olarak dir %userprofile%\desktop kullanabilir ve bu da Windows Çalıştır iletişim kutusu aracılığıyla çalışır. Komut satırı argümanları için komut yorumlayıcısının davranışına bağlı olarak, doğrudan CreateProcess üzerinden çalışabilir veya olmayabilir. Windows API seviyeli fonksiyonlarını kullanıldığında


Genel olarak, <windows.h> eklemeden önce UNICODE tanımlar, yani wchar_t merkezli metin tabanlı işlevleri kullanmak (veya ...W işlevleri açıkça kullanın) için tercih edilir.