VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 737|回复: 0

[原创] 解析命令行参数

[复制链接]
31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-3-11 22:44:59 | 显示全部楼层 |阅读模式
注释没有,看不懂就看到懂为止,多上机。
控制台、Win32、MFC程序都适用。
  1. #include <windows.h>
  2. #include <tchar.h>

  3. #if 0
  4. typedef struct _MYCMD
  5. {
  6.         TCHAR *Cmd[20] = { 0 };
  7.         int nLen = 0;
  8. }MYCMD, *LPMYCMD;

  9. MYCMD GetCmdLine(TCHAR *CmdLine)
  10. {
  11.         TCHAR seps[] = _T(" ,\t\n");
  12.         TCHAR *token1 = NULL;
  13.         TCHAR *next_token1 = NULL;
  14.         token1 = _tcstok_s(CmdLine, seps, &next_token1);
  15.         MYCMD cmd;
  16.         do
  17.         {
  18.                 if (token1 != NULL)
  19.                 {
  20.                         cmd.Cmd[cmd.nLen] = token1;
  21.                         token1 = _tcstok_s(NULL, seps, &next_token1);
  22.                         cmd.nLen++;
  23.                 }
  24.         } while (token1 != NULL && cmd.nLen < 20);
  25.         return cmd;
  26. }
  27. #endif

  28. // 获取命令行参数,最多返回20个
  29. class MyCMD
  30. {
  31. public:
  32.         MyCMD(TCHAR *szCMD);
  33.         TCHAR **Get();
  34.         ~MyCMD();

  35.         TCHAR *Cmd[20] = { 0 };
  36.         int nLen = 0;
  37. private:
  38.         TCHAR *szCmd = NULL;
  39. };

  40. MyCMD::MyCMD(TCHAR *szCMD)
  41. {
  42.         int size = _tcsclen(szCMD) * sizeof(TCHAR) + sizeof(TCHAR);
  43.         this->szCmd = new TCHAR[size]{ 0 };
  44.         memcpy_s(szCmd, size, szCMD, size);
  45. }

  46. TCHAR ** MyCMD::Get()
  47. {
  48.         TCHAR seps[] = _T(" ,\t\n");
  49.         TCHAR *token1 = NULL;
  50.         TCHAR *next_token1 = NULL;
  51.         token1 = _tcstok_s(this->szCmd, seps, &next_token1);
  52.         do
  53.         {
  54.                 if (token1 != NULL)
  55.                 {
  56.                         Cmd[nLen] = token1;
  57.                         token1 = _tcstok_s(NULL, seps, &next_token1);
  58.                         nLen++;
  59.                 }
  60.         } while (token1 != NULL && nLen < 20);

  61.         return Cmd;
  62. }

  63. MyCMD::~MyCMD()
  64. {
  65.         delete[]szCmd;
  66. }

  67. int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPTSTR lpCmdLine, int nShowCmd)
  68. {
  69.         //MYCMD cmd = GetCmdLine(lpCmdLine);
  70.         MyCMD cmd(lpCmdLine);
  71.         cmd.Get();
  72.         if (cmd.nLen != 2)
  73.         {
  74.                 MessageBox(NULL, _T("参数错误, 参数一为源文件,参数二为目标文件"), _T("错误"), MB_ICONERROR);
  75.                 return -1;
  76.         }

  77.         if (!CopyFileW(cmd.Cmd[0], cmd.Cmd[1], FALSE))
  78.         {
  79.                 MessageBox(NULL, _T("复制失败"), _T("错误"), MB_ICONERROR);
  80.                 return -1;
  81.         }

  82. #if 0
  83.         LPWSTR *szArgv = NULL;
  84.         int nArgc = 0;
  85.         szArgv = CommandLineToArgvW(GetCommandLine(), &nArgc);
  86.         if (nArgc != 3)
  87.         {
  88.                 MessageBox(NULL, _T("参数错误, 参数一为源文件,参数二为目标文件"), _T("错误"), MB_ICONERROR);
  89.                 goto exit;
  90.         }

  91.         if (!CopyFileW(szArgv[1], szArgv[2], FALSE))
  92.         {
  93.                 MessageBox(NULL, _T("复制失败"), _T("错误"), MB_ICONERROR);
  94.         }

  95. exit:
  96.         LocalFree(szArgv);
  97. #endif
  98.         return 0;
  99. }
复制代码

评分

参与人数 3驿站币 +18 热心值 +6 收起 理由
70_avatar_small tony666 + 1 + 1 感谢分享!
75_avatar_small wl1383838438 + 15 + 3 赞一个!
58_avatar_small thzzl + 2 + 2 支持原创!

查看全部评分





上一篇:DLL“动态调用”的两种“姿势”
下一篇:Win32 控件失能后的字体颜色修改
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-29 17:32

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表