对 Windows SDK 熟悉的程序员都知道,WinMain 函数的第三个参数是用户指定的命令行。对 API 熟悉的程序员还知道,如果想在程序的任何地方使用命令行,还可以调用 GetCommandLine() API。
幸运的是,老汉是个混了很多年的程序员,刚好两种方法都知道。不幸的是,老汉一直以为这两个方法得到的玩意儿是一样的,前两天在做一个小程序的时候偶尔才发现,竟然不一样!区别在于:WinMain 的命令行参数中没有应用程序的全路径,而 GetCommandLine() 得到的命令行是有的。
于是有了下面这个副产品,把命令行里的程序全路径滤掉。技术上没有难度,唯一需要注意的是引号的处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
LPTSTR SkipProgramName(LPTSTR pszCmdLine) { LPTSTR p = pszCmdLine; BOOL bInQuotes = FALSE; // // Skip executable name // for(p; *p; p = CharNext(p)) { if((*p == TEXT(' ') || *p == TEXT('\t')) && !bInQuotes) break; if(*p == TEXT('\"')) bInQuotes = !bInQuotes; } while(*p == TEXT(' ') || *p == TEXT('\t')) p++; return p; } |