WinMain的原型:
int WINAPI WinMain(HINSTANCE hinstance,//程序本身的实例句柄
HINSTANCE hPrevInstance,//历史遗留,hPrevInstance=NULL;
LPSTR lpCmdLine,//命令行字符串
int nCmdShow);//窗口显示模式
main的原型:
int main(int argc , char *argv[])
其中argc是命令行参数的个数,argv[]是命令行参数的字符数组指针。
在网上闲逛,无意中发现,原来Windows API的C语言编程,并不一定需要使用WinMain入口函数。
如果不使用WinMain的四个参数,那么直接使用main代替WinMain就完全可以了。
如果程序中使用了WinManin的某个参数,那么也可以用main替代,但是需要增加WinMain的四个参数作为变量:
....
HINSTANCE hInstance;
int iCmdShow;
LPTSTR szCmdLine;
hInstance=GetModuleHandle(NULL); //获取程序本身的实例句柄
iCmdShow=SW_SHOWNORMAL;//定义窗口显示模式
szCmdLine=GetCommandLine();//获取命令行字符串
....(hPrevInstance=NULL;这个是历史遗留问题,一般程序用不到这个参数)
不过有一点要说明的就是GetCommandLine()函数返回的命令行参数带有执行程序本身的名字,
而WinMain的参数LPSTR lpCmdLine是不包含执行程序的名字本身的。
不过,这样看这个参数在程序中的作用是什么,如果只是作为字符串,那么两者没有差别。
int WINAPI WinMain(HINSTANCE hinstance,//程序本身的实例句柄
HINSTANCE hPrevInstance,//历史遗留,hPrevInstance=NULL;
LPSTR lpCmdLine,//命令行字符串
int nCmdShow);//窗口显示模式
main的原型:
int main(int argc , char *argv[])
其中argc是命令行参数的个数,argv[]是命令行参数的字符数组指针。
在网上闲逛,无意中发现,原来Windows API的C语言编程,并不一定需要使用WinMain入口函数。
如果不使用WinMain的四个参数,那么直接使用main代替WinMain就完全可以了。
如果程序中使用了WinManin的某个参数,那么也可以用main替代,但是需要增加WinMain的四个参数作为变量:
....
HINSTANCE hInstance;
int iCmdShow;
LPTSTR szCmdLine;
hInstance=GetModuleHandle(NULL); //获取程序本身的实例句柄
iCmdShow=SW_SHOWNORMAL;//定义窗口显示模式
szCmdLine=GetCommandLine();//获取命令行字符串
....(hPrevInstance=NULL;这个是历史遗留问题,一般程序用不到这个参数)
不过有一点要说明的就是GetCommandLine()函数返回的命令行参数带有执行程序本身的名字,
而WinMain的参数LPSTR lpCmdLine是不包含执行程序的名字本身的。
不过,这样看这个参数在程序中的作用是什么,如果只是作为字符串,那么两者没有差别。
测试一下,就用一个最简单程序:
WinMain版:
#include<windows.h>
int WINAPI WinMain(HINSTANCE h1,HINSTANCE h2,LPTSTR cmdline,int cmdshow)
{
MessageBox(NULL,
cmdline,
"CmdLine",
MB_OK | MB_ICONINFORMATION);
return 0;
}
因为WinMain的cmdline不包含程序名,所以就什么也没有显示。
main版:
#include<windows.h>
int main(int argc,char *argv)
{
LPTSTR cmdline; //要用到这个参数,就用变量代替原来的参数
cmdline=GetCommandLine();//获取命令行字符串,包括程序名本身
MessageBox(NULL,
cmdline,
"CmdLine",
MB_OK | MB_ICONINFORMATION);
return 0;
}
用main代替WinMain除了命令行参数是否包含程序本身名字这一点外,其他未发现不同。
测试了《Windows程序设计第五版》中的几个程序,都可以正常运行。
最后补充说明:对于iCmdShow还可以不在程序中指定,由系统输入获得:
STARTUPINFO StartupInfo;
memset(&StartupInfo,0,sizeof(STARTUPINFO));
GetStartupInfo(&StartupInfo);
iCmdShow = (int)StartupInfo.wShowWindow;//获取窗口显示模式
另外为了获得更准确的cmdline,可以自编一个函数,不过我自编的这个函数,会去掉命令行中多余的空格:
//用这个函数可以返回去掉了多余空格的szCmdLine
LPTSTR GetCmdLine(int argc,char *argv[])
{
int i=0;
int length=0;
char * cmdline;
if(argc<2)
return TEXT("");
for(i=1; i<argc; i++)
{
length=length + strlen(argv[i]);
}
cmdline = (char *)malloc(sizeof(char)*(length + argc -1));
strcpy(cmdline,argv[1]);
if(argc>2)
{
for(i=2;i<argc;i++)
{
strcat(cmdline," ");
strcat(cmdline,argv[i]);
}
}
return TEXT(cmdline);
}