优秀的编程知识分享平台

网站首页 > 技术文章 正文

关于Win32 SDK(C++)的命令行获取,通过argc和argv

nanyue 2024-07-17 16:01:00 技术文章 18 ℃

原来获取命令行是这样的:


  1. int APIENTRY wWinMain(
  2. _In_HINSTANCEhInstance,
  3. _In_opt_HINSTANCEhPrevInstance,
  4. _In_LPWSTRlpCmdLine,
  5. _In_intnShowCmd
  6. )
  7. {
  8. UNREFERENCED_PARAMETER(hPrevInstance);
  9. UNREFERENCED_PARAMETER(lpCmdLine);
  10. //...
  11. return (int)msg.wParam;
  12. }

上面的初始化代码里面有一个参数,lpCmdLine就是命令行。不过这样有一个问题——一个个去写字符串分析很烦,还弄得代码一大串。前段时候,在网上看到了<stdlib.h>里面的__argc和__argv可以当成控制台里面的用。当时那个兴奋。火速完成了下面的代码。


  1. int APIENTRY wWinMain(
  2. _In_HINSTANCEhInstance,
  3. _In_opt_HINSTANCEhPrevInstance,
  4. _In_LPWSTRlpCmdLine,
  5. _In_intnShowCmd
  6. )
  7. {
  8. UNREFERENCED_PARAMETER(hPrevInstance);
  9. UNREFERENCED_PARAMETER(lpCmdLine);
  10. // 前初始化 - 参数配置等
  11. #if _DEBUG_VER_
  12. FILE *stream;
  13. AllocConsole();
  14. freopen_s(&stream, "CONOUT$", "w", stdout);
  15. #endif
  16. // 命令行
  17. int cnum = __argc, i = 0;
  18. char** cm = __argv;
  19. while (cnum--)
  20. {
  21. printf("%s\r\n", cm[i]);
  22. i++;
  23. }
  24. // 。。。
  25. }

看出问题了吗?如果可能的话你可以自己去试试,运行就崩溃。本来这方面资料就少,翻遍百度找不到一个。后来,我发现__argv是char **型的,难道wWinMain里面不能出现ANSI的这种?

通过查找它们在<stdlib.h>中的定义,我找到了 __wargv ,是__argv对应的宽字符类型。思来想去都觉得是wWinMain里面不能出现ANSI的__argv这种问题,便马上改了改:


  1. int APIENTRY wWinMain(
  2. _In_HINSTANCEhInstance,
  3. _In_opt_HINSTANCEhPrevInstance,
  4. _In_LPWSTRlpCmdLine,
  5. _In_intnShowCmd
  6. )
  7. {
  8. UNREFERENCED_PARAMETER(hPrevInstance);
  9. UNREFERENCED_PARAMETER(lpCmdLine);
  10. // 前初始化 - 参数配置等
  11. #if _DEBUG_VER_
  12. FILE *stream;
  13. AllocConsole();
  14. freopen_s(&stream, "CONOUT$", "w", stdout);
  15. #endif
  16. // 命令行
  17. int cnum = __argc, i = 0;
  18. wchar_t** cm = __wargv;
  19. while (cnum--)
  20. {
  21. wprintf(L"%s\r\n", cm[i]);
  22. i++;
  23. }
  24. // ...
  25. }

一测试,诶呀终于成功了。因为网上没有这方面的说明,所以就把它记下来了,希望对遇到类似问题的有所帮助

Tags:

最近发表
标签列表