Win32 API功能封装
+ -

WinMain的命令行参数解析

2021-08-30 829 0

一般情况下,当我们开发标准C或者Win32控制台程序的程序时,其函数入口为main,运行时库已经帮我们解析好了参数,我们直接使用2个参数:”argc” 和 “argv”,就可以获取到各个参数.

int main(int argc, char * argv[]) 
{
    int i=0;
    for(i=0;i,argc;i++)
    {
        printf("argv[%d]=%sn",i,argv[i]);
    }
}

“argc”为命令行参数的个数,
“argv”则为传入参数的数组列表。

但是当我们在Visual Studio中创建Win32 GUI程序的时候,WinMain变成程序的入口函数,而该函数并没有”argc” 和”argv”参数,那我们怎样给Windows程序传入命令行参数呢?Windows程序中又怎样取得这些传入的参数呢?

第一种方法

我们知道,winmain的声名如下:

//使用Ansi字符

int _stdcall WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)

//使用UNICODE字符

int _stdcall _tWinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow
)

其有一个参数lpCmdLine,所以我们可以通过这个参数来获取命令行参数,不过不方便的是,lpCmdLine的内容为整行命令字符串参数,并没有方便的像控制台程序一样,帮我们进行了参数分隔,所以我们需要自行进行参数分隔。

第二种方法

这种方法就是使用GetCommandLine() API。这个函数返回整个命令行,它把程序自身名称(包括程序的绝对路径)和所有参数放在一个字符串中。该函数非常类似于对lpCmdLine的直接访问。但它的一个好处是能够根据你当前工程的设置自动映射到GetCommandLineA()或者GetCommandLineW()函数。因此解决了访问Unicode命令行输入的问题。但是它还是既没有提供命令行参数数目,也没有类似argv那样把参数自动分割成独立变量的能力。

CommandLineToArgvW()函数
最后一个我要讨论的方法是CommandLineToArgvW函数。这个函数只有Unicode宽字符版本,没有对应的CommandLineToArgvA函数。它的声明如下:

LPWSTR *CommandLineToArgvW(LPCWSTR lpCmdLine, int *pNumArgs)

该函数和’argc’/‘argv’一样简单,但是它并不是在Windows程序中直接访问argc和argv变量。如声明所示,函数接受两个参数,一个是需要解析的Unicode命名行字符串,另外一个是指向整型变量的指针。函数在返回时把参数数目存到这个整型变量中。

函数返回一个类似于’argv’的字符串数组。让我们看一个例子:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    LPWSTR *szArgList;
    int argCount;

     szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
     if (szArgList == NULL)
     {
         MessageBox(NULL, L"Unable to parse command line", L"Error", MB_OK);
         return 0;
     }

     for(int i = 0; i < argCount; i++)
     {
         MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK);
     }

     LocalFree(szArgList);//必须调用这个函数,否则会内存泄露
     return 0;
}

如上所示,通过这个函数,我们可以取得命令行参数的数目(argc)和一个字符串列表(argv)。这里唯一要注意的事情是该函数会给返回参数列表分配一块内存。当我们用完列表后需要手动地释放该内存,否则就会有内存泄露

0 篇笔记 写笔记

WinMain命令行参数解析
一般情况下,当我们开发标准C或者Win32控制台程序的程序时,其函数入口为main,运行时库已经帮我们解析好了参数,我们直接使用2个参数:”argc” 和 “argv”,就可以获取到各个参数.int main(int argc, char * argv[]) { int i=0; ......
快速调出Windows音频控制面板命令行
VC可可以直接调用:WinExec("rundll32.exe shell32.dll, Control_RunDLL mmsys.cpl", SW_HIDE);或者在命令行中运行rundll32.exe shell32.dll, Control_RunDLL mmsys.......
ARP 命令行工具
ARP命令常见用法arp -aarp –g用于查看缓存中的所有项目。-a和-g参数的结果是一样的,多年来-g一直是UNIX平台上用来显示ARP缓存中所有项目的选项,而Windows用的是arp -a(-a可被视为all,即全部的意思),但它也可以接受比较传统的-g选项。arp -a Ip如......
Win32进程参数处理
参数的内存申请 HANDLE handle = GetProcessHeap();//获取默认的堆 LPVOID pMem = HeapAlloc(handle, 0, 0x1400ui64); if(pMem) { memset_0(pMem, 0, 0x1400ui64);......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!