Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: system command và console command ???

  1. #1
    Ngày gia nhập
    04 2007
    Bài viết
    30

    Mặc định system command và console command ???

    ví dụ để chỉnh màu chữ khi xuất ra , ta có 2 cách:
    1.. system("color ab"). Trong đó a, b là 2 giá trị Hexa , a là màu nền , b là màu chữ .

    2..dùng lệnh qua Console

    Visual C++ Code:
    1. HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);
    2. SetConsoleTextAttribute(a,x);
    3. Trong đó x là 1 biến chỉ giá trị màu(1:blue ; 2:green.... 15:bright white)

    cho em hỏi là 2 cách đó có gì khác nhau , việc dùng các lệnh system có gây ảnh hưởng gì đến máy ko ??

  2. #2
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Không ảnh hưởng gì, chỉ làm chậm ct và phình to ct. system là một wrapper cho các hàm bên dưới. Trên Windows, nó là wrapper cho lời gọi CreateProcess với cmd.exe/command.com shell và vô số cái khác nữa. Vì vậy nên tránh gọi system trong ct.
    Đoạn code dưới là Win32 API Console, chỉ dùng cho các ct viết cho Win32.
    Dưới đây là source code của hàm system, file system.c trong VS 2005.

    Visual C++ Code:
    1. /***
    2. *system.c - pass a command line to the shell
    3. *
    4. *       Copyright (c) Microsoft Corporation. All rights reserved.
    5. *
    6. *Purpose:
    7. *       defines system() - passes a command to the shell
    8. *
    9. *******************************************************************************/
    10.  
    11. #include <cruntime.h>
    12. #include <process.h>
    13. #include <io.h>
    14. #include <stdlib.h>
    15. #include <errno.h>
    16. #include <tchar.h>
    17. #include <dbgint.h>
    18. #include <internal.h>
    19.  
    20. /***
    21. *int system(command) - send the command line to a shell
    22. *
    23. *Purpose:
    24. *       Executes a shell and passes the command line to it.
    25. *       If command is NULL, determine if a command processor exists.
    26. *       The command processor is described by the environment variable
    27. *       COMSPEC.  If that environment variable does not exist, try the
    28. *       name "cmd.exe" for Windows NT and "command.com" for Windows '95.
    29. *
    30. *Entry:
    31. *       char *command - command to pass to the shell (if NULL, just determine
    32. *                       if command processor exists)
    33. *
    34. *Exit:
    35. *       if command != NULL  returns status of the shell
    36. *       if command == NULL  returns non-zero if CP exists, zero if CP doesn't exist
    37. *
    38. *Exceptions:
    39. *
    40. *******************************************************************************/
    41.  
    42. int __cdecl _tsystem (
    43.         const _TSCHAR *command
    44.         )
    45. {
    46.         _TSCHAR *argv[4];
    47.         _TSCHAR *envbuf = NULL;
    48.         unsigned int osver = 0;
    49.         int retval = 0;
    50.  
    51.         _ERRCHECK_EINVAL(_tdupenv_s_crt(&envbuf, NULL, _T("COMSPEC")));
    52.         argv[0] = envbuf;
    53.  
    54.         /*
    55.          * If command == NULL, return true IFF %COMSPEC%
    56.          * is set AND the file it points to exists.
    57.          */
    58.  
    59.         if (command == NULL)
    60.         {
    61.             if(argv[0]==NULL)
    62.             {
    63.                 goto cleanup;
    64.             }
    65.             else
    66.             {
    67.                 /* _taccess_s does not change errno if the return value is 0*/
    68.                 errno_t e = _taccess_s(argv[0], 0);
    69.                 retval = (e == 0);
    70.                 goto cleanup;
    71.             }
    72.         }
    73.  
    74.         _ASSERTE(*command != _T('\0'));
    75.  
    76.         argv[1] = _T("/c");
    77.         argv[2] = (_TSCHAR *) command;
    78.         argv[3] = NULL;
    79.  
    80.         /* If there is a COMSPEC defined, try spawning the shell */
    81.  
    82.         /* Do not try to spawn the null string */
    83.         if (argv[0])
    84.         {
    85.                 errno_t save_errno = errno;
    86.                 errno = 0;
    87.  
    88.                 if ((retval = (int)_tspawnve(_P_WAIT,argv[0],argv,NULL)) != -1)
    89.                 {
    90.                     errno = save_errno;
    91.                     goto cleanup;
    92.                 }
    93.                 if (errno != ENOENT && errno != EACCES)
    94.                 {
    95.                     goto cleanup;
    96.                 }
    97.                 errno = save_errno;
    98.         }
    99.  
    100.         /* No COMSPEC so set argv[0] to what COMSPEC should be. */
    101.         _ERRCHECK(_get_osver(&osver));
    102.         argv[0] = ( osver & 0x8000 ) ? _T("command.com") : _T("cmd.exe");
    103.  
    104.         /* Let the _spawnvpe routine do the path search and spawn. */
    105.  
    106.         retval = (int)_tspawnvpe(_P_WAIT,argv[0],argv,NULL);
    107.         goto cleanup;
    108.  
    109. cleanup:
    110.         _free_crt(envbuf);
    111.         return retval;
    112. }

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    30

    cám ơn bạn ^ ^ mặc dù chưa hiểu lắm nhưng mình cũng thấy là ko nên gọi các lệnh trong system nữa . Nhưng tại sao khi chuyển từ C sang C++ thì 1 số hàm lại phải thay đổi nhỉ , nếu cứ giữ nguyên như trước thì đỡ phiền biết bao ( nhìu hàm trên C giống trên Pascal lắm )

  4. #4
    Ngày gia nhập
    04 2007
    Bài viết
    128

    Hoàn toàn có thể giữ nguyên được, khai báo thư viện thì sử dụng lệnh được bình thường, hix, nhưng nghĩ lại thì sao lại phải chia ra C với C++ nhỉ? rất giống nhau mà, trước giờ mình chưa xài 1 trình dịch nào dành riêng cho C, toàn là trình dịch của C++, hồi học C cũng viết ké trên đó.

  5. #5
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Khác chứ soda, phải phân biệt rõ C và C++ vì chỉ trong C++ mới có OOP và cấu trúc của C++ khác rất nhiều với C nếu như bạn học kỹ. Bản thân tôi chưa từng học C, nhảy vào học C++ luôn (chuẩn ANSI C++) và tôi rất khó chịu khi đọc code mà người viết dùng câu lệnh C tại vì tôi ko hiểu gì cả. Lệnh system đúng là làm cho chương trình mình nặng nề thật nhưng nó ngắn gọn và súc tích, viết cái hiểu luôn chứ ko dài dòng và khó nhớ như lệnh console.

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mặc định system command và console command ???

    Viết C++ xong thì thật sự là không còn khoái C nữa . Còn việc dùng hàm system không chỉ có ngắn gọn và xúc tích đâu . Nó thật sự hữu dụng và mạnh mẽ với các newbie muốn táy máy hệ điều hành đấy . Cụ thể thì cậu có thể viết một file shutdow . retast . logof . Tạo riêng một user + pass và thậm chí là một con virus chỉ duy nhất lệnh system này .( Chỉ có một điều là nếu với system thì không thể thỏa tính open port , scan port hay lây nhiễm tuy nhiên có thể kiến thức tớ còn kém thôi chứ khi học sâu + nghiên cứu hệ thống nghiêm túc các cậu hoàn toàn có thể ) .

  7. #7
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    system thì làm chậm ct, nhưng làm phình to ct thì không đến nỗi nào, vì bản thân ct chính chẳng xử lý gì nhiều cả, phần phình to không đáng kể, hoặc thậm chí là không có
    Trình biên dịch riêng C thì có lẽ là BC trước version 3, các trình biên dịch C++ hiện tại đều có thể build được C chuẩn. Vì về mặt cú pháp thì C++ bao lên C chuẩn. 1 cách mặc định trong VC, nếu các bạn muốn build C++ thì đặt tên file là *.cpp, nếu các bạn muốn build C chuẩn thì đặt tên file là *.c

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Sao lại không phình to ra, đáng kể nữa là khác. Trên Win32, nếu bạn build dynamic thì không sao, vì nó nằm hết trong C RTL DLL (msvc*.dll). Nhưng nếu bạn build static thì đáng kể đấy, vì compiler và linker sẽ chỉ nhúng code của tất cả hàm nào dùng tới. Vd trường hợp trên, trong code exe của chúng ta sẽ có thêm code của tất cả các hàm sau: system, _tdupenv_s_crt, _taccess_s, _tspawnve, _get_osver, _free_crt.
    Nếu các cậu có VC++6 hay VS 2005, vào thư mục Crt\src của nó, rồi search ra từng hàm mà đọc. Bảo đãm các cậu sẽ vào mê hồn trận luôn, hết biết đường ra. Lúc này đừng có nói là exe không phình to ra nhé. Hoặc đơn giản hơn là các cậu debug stepin vào hàm system và các hàm con của nó, hoặc dùng một trình profiler hay code coverage nào đó để xem số hàm con, thời gian gọi....
    Hiểu rõ thì mới trả lời.

  9. #9
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    nếu build static thì chắc vậy
    trong vc mình không thấy có option để build static (ngoại TRỪ MFC), nên mình nghĩ mặc nhiên nó là build dynamic
    có lẽ có option để build static, vì thực ra trong thư viện vẫn có source code của những hàm trên, nhưng mình không biết option đó
    Đã được chỉnh sửa lần cuối bởi nguyentuan2 : 28-05-2007 lúc 01:18 PM.

Các đề tài tương tự

  1. Cách sử dụng lệnh update command, delete command trong C# khi kết nối vs CSDL là Access
    Gửi bởi minhvu1234 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 05-11-2013, 08:16 PM
  2. Gửi lệnh AT Command với USB 3G
    Gửi bởi o0ocuchuoio0o trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 19-08-2013, 08:58 AM
  3. Gọi system command từ java console?
    Gửi bởi langman trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 1
    Bài viết cuối: 23-09-2010, 12:36 PM
  4. [Hỏi]Thực hiện command line
    Gửi bởi hoangsan_c trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 7
    Bài viết cuối: 06-06-2009, 07:16 AM
  5. hướng dẫn tạo command line ở VC++6.0
    Gửi bởi nguyenk2089@yahoo.com trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 20-08-2008, 05:45 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn