【发布时间】:2021-07-30 17:24:50
【问题描述】:
我有一个 C/C++ winapi 程序,我想将命令行功能扩展到该程序(我在 C# 中看到过,但从未在 C++ 中看到过)。如果可执行文件在没有参数的情况下打开,它会正常打开窗口,但是当从带有参数(例如输入或输出文件)的命令行调用时,窗口不会打开,所有用户交互都是通过命令行完成的。我怎么能做到这一点?最好我希望能够在 C 中完成,因为那是我的 WinMain() 函数所在的地方。
提前感谢您的帮助!
【问题讨论】:
我有一个 C/C++ winapi 程序,我想将命令行功能扩展到该程序(我在 C# 中看到过,但从未在 C++ 中看到过)。如果可执行文件在没有参数的情况下打开,它会正常打开窗口,但是当从带有参数(例如输入或输出文件)的命令行调用时,窗口不会打开,所有用户交互都是通过命令行完成的。我怎么能做到这一点?最好我希望能够在 C 中完成,因为那是我的 WinMain() 函数所在的地方。
提前感谢您的帮助!
【问题讨论】:
WinMain 中有LPSTR lpCmdLine 参数。您可以使用CommandLineToArgvW 函数解析lpCmdLine。当必要的参数存在时,您将不会创建或显示程序窗口并执行此工作。
【讨论】:
pNumArgs 传递给CommandLineToArgvW 的命令行参数的数量?编辑:没关系,它是一个指向将分配参数数量的指针。非常感谢!
CommandLineToArgvW 是辅助函数。您可以使用循环直接分析lpCmdLine,尤其是在您只期望 1 个参数的情况下。 CommandLineToArgvW 很好解析,例如带引号的长文件名。
CommandLineToArgvW()时,最好使用GetCommandLineW()来保证Unicode字符串,而不是WinMain()的lpCmdLine参数,它不是Unicode字符串。跨度>
您可以通过多种方式将(解析的)命令行参数传递给您的应用程序。
CRT 将命令行作为第三个参数传递到用户提供的入口点 (WinMain)。取决于您的应用程序是否为 Unicode 编译,这是一个宽字符串或一个窄字符串。在接受您无法控制的输入时,不能保证使用窄字符版本。命令行正在接受您无法控制的输入,因此您必须针对 Unicode 进行编译(通过定义 UNICODE 和 _UNICODE 预处理器符号)。
无论哪种方式,命令行都作为单个字符串传递。因此,除非您解析出各个参数,否则它的效用有限。
Windows API 提供了GetCommandLineW 函数,允许您在程序中的任何位置获取指向命令行的指针。同样,这仅返回单个字符串。可以通过调用CommandLineToArgvW 将字符串解析为单独的参数,从而生成参数数组及其大小。请注意,CommandLineToArgvW 没有窄字符版本,因此如果您不针对 Unicode 进行编译,则不能将其应用于传递给 WinMain 的命令行参数。
无论如何,即使您不针对 Unicode 进行编译,这两个 API 调用也是可用的。
如果您不关心可移植性,Microsoft 的 CRT 实现提供了__argc, __argv, __wargv 全局变量,可以在程序中的任何位置使用它来获取已解析的命令行。虽然方便,但它取决于定义的预处理器符号 __wargv 是否存储有效指针。只有在定义了_UNICODE 时才会这样做。
【讨论】: