Lấy thông tin biên dịch khi sử dụng GCC compiler trên CMD

Cho em hỏi làm sao để lấy output khi thực hiện câu lệnh trên cmd ạ?. Ở code của em GCC vẫn thực hiện dịch bình thường, nhưng khi xuất thông tin dịch MessageBox.Show() thì không có gì, có phải em đã sai ở đâu không?
Em dùng trình dịch GCC để dịch C cụ thể code như sau:

Process BienDich =new Process();
BienDich.StartInfo.FileName = "cmd";
BienDich.StartInfo.UseShellExecute = false;
BienDich.StartInfo.RedirectStandardOutput = true;
BienDich.StartInfo.RedirectStandardInput = true;

if (enabledebug == false)
    BienDich.StartInfo.Arguments = "/c " + "g++ "+ ten + " -o " + Path.GetDirectoryName(ten) + "\\" + Path.GetFileNameWithoutExtension(ten) + ".exe";
else BienDich.StartInfo.Arguments = "/c " + "g++ " +" -g "+ ten + " -o " + Path.GetDirectoryName(ten) + "\\" + Path.GetFileNameWithoutExtension(ten) + ".exe";

//BienDich.StartInfo.StandardOutputEncoding = Encoding.UTF8;
BienDich.StartInfo.CreateNoWindow = true;
BienDich.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
BienDich.Start();
string ad;
ad = BienDich.StandardOutput.ReadToEnd();
MessageBox.Show(ad);

Nhớ lúc trước cũng gặp phải vấn đề tương tự của bạn.
Có lẽ bạn chưa chờ cho tiến trình thực hiện xong mà đã lấy dữ liệu xuất của tiến trình (khi đó chưa có gì).
Bạn thử gọi đến WaitForExit() ngay sau Start() rồi mới lấy dữ liệu.

Ngoài ra nếu bạn muốn quá trình diễn ra chân thực hơn thì bạn nên thử dùng sự kiện OutputDataReceivedErrorDataReceived để nhận dữ liệu thời gian thực theo mỗi dòng.

2 Likes

Cảm ơn anh, nhưng mà cả hai cách trên thì nó vẫn không được ạ. Khi em sử dụng cmd rồi nhập lệnh chay vào thì nó vẫn hiện bth.

Ủa, không chú ý!

Sao bạn lại gọi đến cmd làm gì?
Bạn phải gọi trực tiếp đến g++ chứ!

1 Like

ý em là mở riêng cmd ra rồi nhập lệnh g++ <đường dẫn tới tệp cần dịch> thì nó vẫn thông báo lỗi bth. Còn em code thì chỉ biết mỗi mở cmd lên rồi cho nó chạy cái lệnh như trên thôi nhưng nó k lấy được cái thông báo lỗi

để lấy được error thì bạn cần redirect thêm cả ErrorStreamOutput = true nữa. Chi tiết cách thực hiện thì trên document của MS có ghi khá là chi tiết kèm ví dụ đầy đủ, bạn có thể tự play

Ngoài ra bạn có thể thử dùng ErrorDataReceived và OutputDataReceived event thì sẽ cho trải nghiệm tốt hơn.

3 Likes

Bạn có thể kèm theo chức năng pipe stderr vào file:

  • trên câu lệnh:
g++ ... &2 > err.txt
  • hoặc trên process, pipe stderr vào file (cái này tuỳ C# có hỗ trợ hay không)
BienDich.StartInfo.RedirectStandardError = "err.txt"; 
// đại loại là thế này, mình không biết cú pháp cụ thể ntn
2 Likes

Được ròi ạ, cảm ơn các anh

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?