`
yidongkaifa
  • 浏览: 4056650 次
文章分类
社区版块
存档分类
最新评论

从Win32程序的主函数WinMain中获取命令行参数

 
阅读更多

在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示:

int main(int argc, char * argv[])

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

lpCmdLine 参数

第一个方案就来自WinMain函数自身。让我们看一个典型的WinMain函数声明:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

如声明所示,WinMain函数有一个类型为"LPSTR(char*)"的参数"lpCmdLine". 这个变量存放着命令行中除程序自身名字外的剩下所有部分。例如,我们有一个名字为"test.exe"的应用程序,当用下面的命令行运行该程序时

test.exe Some arguments here

变量lpCmdLine的值即为"Some arguments here"。尽管该方法不像"argc"和"argv"一样非常方便,但它是获取命令行参数的方法之一。我们需要自己写程序去分析lpCmdLine字符串,这增加了程序的复杂度。

【译注:Windows程序代码同时ANSI版本和UNICODE版本接口。其中WinMain函数为ANSI版本,wWinMain为UNICODE版本。从Visual Studio创建出来的代码主函数命名为_tWinMain。这个函数名会根据当前工程有没有定义_UNICODE宏而在编译时翻译成上面两个不同版本。当翻译成WinMain函数时候,lpCmdLine的类型为LPSTR,而当翻译成wWinMain函数时候,lpCmdLine的类型为 LPWSTR,即宽字符数组】

GetCommandLine()函数

另外一个方法就是使用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 10;
    }

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

    LocalFree(szArgList);
    return 0;
}

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

__argc和__argv变量

另外,微软提供了全局变量__argc 和__argv。这两个变量由Windows在运行时自动赋值。其中__argv有ASCII和Unicode版本,分别为__argv和 __wargv。要使用这两个全局变量,需要引用"stdlib.h"头文件(该头文件已经在windows.h中引用)。为了根据工程设置来自动选择 ASCII还是Unicode版本变量,我们可以引用"TCHAR.h"头文件并访问__targv变量。代码如下

extern int __argc;
extern TCHAR* __targv;

这个方法是所有方法中最简单的一个。但它的代价是程序需要链接VC++运行时库(例如"msvcrt.dll")。当然99%的Windows程序几乎都要使用这个运行库:)

转载自: http://demon.tw/copy-paste/retrieving-command-line-parameters-from-winmain-in-win32.html

分享到:
评论

相关推荐

    在win32工程下做计算器

    windows程序设计中,它必须要包含一个程序入口主 WinMain和一个过程函数WndProc。 总是以下面的形式出现。 WINAPI WinMain (HINSTANCE hInstance, WinMain第一个参数一般叫做“实例句柄”,在windows 第二个...

    Windows窗口应用程序(Win32程序) 源代码

    https://blog.csdn.net/duke56/article/details/103411942 源代码 Win32应用程序,非MFC

    WInmain学习用于理解

    用于初学者理解,主函数winmain在mfc中 与以前 c中mian的不同之处

    Win32 控制台中使用 MFC.zip

    在Virtual C++ 6.0创建的Win32 Application 和 Win32 Console Application 中使用 MFC 是可能的,主要的困难在于绕过MFC提供的WinMain函数。下面我提供一个方法以供参考:

    国外下载的Win32++类库(纯C++代码封装的windows SDK),附源码

    使用C++代码封装的win32操作类, 与MFC相似,对于学习SDK与C++是巨好的参考 Tutorials Menu of tutorials Tutorial 1: The Simplest Window Tutorial 2: Using Classes and Inheritance Tutorial 3: Using ...

    SDK模拟MFC隐藏WinMain,CWinApp,CDialog

    此程序为本人在学习了孙鑫老师vc视频教程后,深彻领悟MFC编程原理和对比了Win32 SDK编程开发流程,经过本人不屑的努力,最终写成的,本人不断反思,探索思考而得,属于100%原创作品。 程序中隐藏WinMain函数,当成...

    VS2010用Win32开发新手模板

    本人根据教程编写的Win32项目模板,把winproc函数分解成多个函数,使用消息映射的方法来处理消息(具体操作请模仿我的代码)。  把WM_PAINT中使用的HDC句柄封装到CHDC类中,可以用这个类来完成画线,设置半透明等...

    vc++编程最简单的winmain程序

    最简单的winmain程序 #include #include LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,...

    WinMain

    一个WinMain程序,About对话框有问题,产生的不对!

    WinMain.rar

    c++窗体程序设计必备winmain函数

    VC++中的WinMain函数

    主要针对vc++课程中的WinMain函数进行了举例说明,并给出了相应的实现代码。

    WinMain 超常用模板

    常用的WinMain写法: 只创建窗口 无多余注释 代码90行 VS2010直接用

    VC++ 使用WinMain建立窗口

    VC++ 使用WinMain建立窗口 欢迎下载使用 VC++ 使用WinMain建立窗口

    WinMain.cpp

    Win32 project 设计窗口类;注册;创建;显示及更新。

    Windows编程基础--窗体篇.rar_WinMain_Windows编程_pcm_winapi_winbase.h

    和C语言中的main()函数一样,Windows程序是从WinMain()函数开始和结束的.WinMain()函数是在WINBASE.H中定义的,其原形如下: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ...

    WIN32图像编程编程SDK实例程序(2).rar

    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; MyRegisterClass( hInstance ); if ( !InitInstance( hInstance, nCmdShow) ) { ...

    winmain函数的用法

    vc中的winmain函数的用法与理解 int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int ...

    入口函数( main、WinMain)

    入口函数( main、WinMain) 在C/C++中,我们知道有一个如下格式的函数: int main(int argc, _TCHAR* argv[]) { return 0; } 该函数是C/C++中的入口函数,而在WindowsAPI中也有自己的入口函数,该函数的格式...

    WinMain的编写

    WinMain的编写

    WinMain程序

    一个简单的WinMain,初学者交流学习。

Global site tag (gtag.js) - Google Analytics