在旧式main()的参数中分解WinMain的cmdLine

uu.*_*uu. 16 c c++ windows winapi

我想转换WinMaincmdLine参数argc,argv所以我可以使用我为控制台应用程序编写的参数解析函数.

除了我想支持"引号"之外,这将是微不足道的.例如:

test.exe test1 test2 "testing testing"

应该

argv[0] = "test.exe"; argv[1] = "test1"; argv[2] = "test2"; argv[3] = "testing testing";
Run Code Online (Sandbox Code Playgroud)

我意识到cmdLine没有程序名(argv [0]); 这没关系我可以使用虚拟值.

我正在考虑用正则表达式来做这件事,(("[^"]+")\s+)|(([^\s]+)\s*)我不确定它会如何运作..可能不是很好?在windows api中是否有任何功能?谢谢

Den*_*s K 23

如果您使用的是Microsoft编译器,则会有公共符号__argc,__argv__wargv在其中定义stdlib.h.这也适用于使用Microsoft运行时库的MinGW.

  • +1.当这些可用时,我个人更喜欢这些而不是`CommandLineToArgvW`,因为你不必调用`LocalFree`,因为`__argv [__ argc]`和`__wargv [__ argc]`被设置为`NULL`. (5认同)

sea*_*n e 5

CommandLineToArgvW看起来在这里会有所帮助.

  • -1我记得`CommandLineToArgvW`不会像`__wgetmainargs`一样处理字符串(由于转义或空格,我忘记了),所以应该使用后者,因为它的行为与普通行为相同`argc` /`argv`传递给`main`. (3认同)
  • 请注意,“CommandLineToArgvW”不会在数组末尾添加标记 NULL 值,因此它与标准 C 中的“argv”的语义并不完全相同。 (2认同)
  • 此外,`CommandLineToArgvW`不会扩展globs.如果`__argc` /`__argv`不可用,则应使用`__getmainargs`或`__wgetmainargs`代替. (2认同)

Tom*_*era 5

基于 Denis K 响应

请参阅:https : //msdn.microsoft.com/library/dn727674.aspx

这将特定于 Windows 的入口点添加到您的应用程序的经典起点:

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd)
{
    return main(__argc, __argv);
}
Run Code Online (Sandbox Code Playgroud)