2009-11-26 14 views
8

Tôi đang sử dụng lệnh system trong C++ để gọi một số chương trình bên ngoài và bất cứ khi nào tôi sử dụng nó, cửa sổ bảng điều khiển sẽ mở và đóng sau khi lệnh kết thúc.Bàn điều khiển Supress khi gọi "hệ thống" trong C++

Làm cách nào để tránh việc mở cửa sổ bảng điều khiển? Tôi sẽ rất vui nếu giải pháp có thể độc lập với nền tảng. Tôi cũng muốn chương trình của tôi đợi cho đến khi lệnh kết thúc.

+0

trùng lặp với câu trả lời hay hơn (dành cho Windows): http://stackoverflow.com/questions/1597289/hide-console-in-c-system-function-win – Steed

Trả lời

3

Có vẻ như bạn đang sử dụng cửa sổ.

Trên Linux (và * nix nói chung), tôi sẽ thay thế cuộc gọi thành system bằng các cuộc gọi tới số forkexec tương ứng. Trên cửa sổ, tôi nghĩ rằng có một số loại chức năng đẻ trứng mới trong Windows API — tham khảo tài liệu hướng dẫn.

Khi bạn đang chạy lệnh shell và/hoặc chương trình bên ngoài, chương trình của bạn khó thực hiện nền tảng độc lập, vì nó sẽ phụ thuộc vào nền tảng có lệnh và/hoặc chương trình bên ngoài bạn đang chạy.

+0

Nói chung, bạn đúng về các chương trình phụ thuộc vào nền tảng khi sử dụng lệnh shell. Tuy nhiên, trong trường hợp này, tôi đảm bảo rằng chương trình bên ngoài được cài đặt trên máy tôi đang sử dụng. Nó không phải là một lệnh shell đơn giản. Về câu trả lời của bạn - Có thể sử dụng CreateProcess cho windows và fork + exec cho unix, nhưng tôi đã hy vọng sẽ giải quyết điều này một cách tao nhã hơn. – Dana

+0

điều gì không thanh lịch về CreateProcess/fork + exec? Nếu bạn quấn nó trong một lớp học tốt đẹp, bạn có một cách rất thanh lịch để bắt đầu quy trình, cộng với bạn có thể dễ dàng thêm các tùy chọn như chuyển hướng đầu ra/đầu vào ect. – stijn

1

Errm. CreateProcess hoặc ShellExecute.

5

Đây có lẽ là cách dễ nhất và có thể là cách tốt nhất, điều này cũng sẽ làm cho chương trình của bạn không bị đóng băng khi chạy lệnh này. Lúc đầu đừng quên bao gồm tiêu đề Windows bằng cách sử dụng;

#include <Windows.h> 

Sau đó, bạn cần sử dụng chức năng sau để chạy lệnh;

WinExec("your command", SW_HIDE); 

Lưu ý; Phương pháp WinExec đã không được chấp nhận trong hơn một thập kỷ. Nó vẫn hoạt động tốt ngày hôm nay mặc dù. Bạn không nên sử dụng phương pháp này nếu không cần thiết.

... thay vì cách bạn không muốn sử dụng;

system("your command"); 
+2

Tôi hầu như không gọi WinExec là "tốt nhất", vì nó không được chấp nhận trong hơn 17 năm. –

+0

Ok, tôi đã không chắc chắn về nó vì vậy thats lý do tại sao tôi nói có lẽ –

+1

Làm việc tốt với tôi, ngay cả khi không được chấp nhận tôi phải upvote kể từ khi tôi đã tìm kiếm giờ. Cảm ơn bạn – Demurgos

0

Đây là cách để thực thi lệnh mà không cần cửa sổ cmd.exe mới. Dựa trên Roland Rabien's answerMSDN, tôi đã viết một hàm làm việc:

int windows_system(const char *cmd) 
{ 
    PROCESS_INFORMATION p_info; 
    STARTUPINFO s_info; 
    LPSTR cmdline, programpath; 

    memset(&s_info, 0, sizeof(s_info)); 
    memset(&p_info, 0, sizeof(p_info)); 
    s_info.cb = sizeof(s_info); 

    cmdline  = _tcsdup(TEXT(cmd)); 
    programpath = _tcsdup(TEXT(cmd)); 

    if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info)) 
    { 
    WaitForSingleObject(p_info.hProcess, INFINITE); 
    CloseHandle(p_info.hProcess); 
    CloseHandle(p_info.hThread); 
    } 
} 

Hoạt động trên tất cả các nền tảng Windows. Gọi giống như bạn system().