MFC程序获得命令行输入

来源:互联网 发布:linux fstab 挂载参数 编辑:程序博客网 时间:2024/06/16 11:09


一个unicode工程,需要处理很多文件,开始的时候没有做成console程序,发现程序写好之后出来了两个问题。程序通过CFileDialog来打开文件夹获得文件路径的。但是一个个打开太麻烦了。于是修改程序使程序接受命令传递的参数。这样就可以通过批处理来完成任务了。

方法1:

 

for (int i=0;i<__argc;i++){__argv[i];将依次得到C:\test\app.exe  -1  -2}

这种和console得到命令参数区别不大,需要注意的是argv[i]前面是双下划线

ANSI console processes written in C can use theargc andargv arguments of the main function to access the command-line arguments. ANSI GUI applications can use thelpCmdLine parameter of theWinMain function to access the command-line string, excluding the program name. The reason thatmain andWinMain cannot return Unicode strings is thatargc, argv, and lpCmdLine use the LPSTR data type for parameters, not theLPTSTR data type. The GetCommandLine function can be used to access Unicode strings, because it uses theLPTSTR data type.

MSDN语句就不翻译了,大致意思就是argv得到的是LPSTR 类型的,ascii编码的。由于工程是UNICODE编码的因此不能,此时使用GetCommandLine

2、使用GetCommandLine

::GetCommandLine();

无参数,返回LPTSTR,根据工程的编码而定。但是需要注意的是,此时返回的是指向整个命令的指针。

eg:"C:\test\app.exe"  -1 -2批处理语句

那么将得到"C:\test\app.exe"  -1 -2整句话。而不是后面的参数-1,-2

3、AfxGetApp()->m_lpCmdLine;

这时只是得到后面的-1,-2参数


 核心编程中指出一个相当简单实用的方法:

 

应用程序可以按照它选择的方法来分析和转换命令行字符串。实际上可以写入p s z C m d L i n e参数指向的内存缓存,但是在任何情况下都不应该写到缓存的外面去。我总是将它视为只读缓存。如果我想修改命令行,首先我要将命令行拷贝到应用程序的本地缓存中,然后再修改本地缓存。也可以获得一个指向进程的完整命令行的指针,方法是调用G e t C o m m a n d L i n e 函数:

PTSTR GetCommandLine();

该函数返回一个指向包含完整命令行的缓存的指针,该命令行包括执行文件的完整路径名。

许多应用程序常常拥有转换成它的各个标记的命令行。使用全局性__argc(或__wargv)变量,应用程序就能访问命令行的各个组成部分。下面这个函数CommandLineToArgvW将Unicode字符串分割成它的各个标记:

PWSTR CommandLineToArgvW(PWSTR pszCmdLine,   int pNumArgs); 

正如该函数名的结尾处的W 所暗示的那样,该函数只存在于U n i c o d e 版本中(W 是英文单词‘Wi d e ’的缩写)。第一个参数p s z C m d L i n e 指向一个命令行字符串。这通常是较早时调用G e t C o m m a n d L i n e W 而返回的值。P N u m A rg s 参数是个整数地址,该整数被设置为命令行中的参数的数目。C o m m a n d L i n e To A rg v W 将地址返回给一个U n i c o d e 字符串指针的数组。