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是不包含执行程序的名字本身的。

不过,这样看这个参数在程序中的作用是什么,如果只是作为字符串,那么两者没有差别。

测试一下,就用一个最简单程序:

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);
}

WinMain和main的更多相关文章

  1. Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)

    Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...

  2. WinMain是如何被调用的

    WinMain函数 WinMain函数原型 Win32应用程序的入口函数为WinMain,函数原型在WinBase.h文件中: int WINAPI WinMain (     _In_ HINSTA ...

  3. asp.net c# 网上搜集面试题目大全(附答案)

    1.String str=new String("a")和String str = "a"有什么区别? String str = "a"; ...

  4. OpenCascade Tcl vs. ACIS Scheme

    OpenCascade Tcl vs. ACIS Scheme eryar@163.com 摘要Abstract:本文通过OpenCascade的Tcl/Tk和ACIS的Scheme的对比来说明脚本语 ...

  5. [转]asp.net c# 网上搜集面试题目(附答案)

    本文转自:http://www.cnblogs.com/hndy/articles/2234188.html 1.String str=new String("a")和String ...

  6. 学习打造自己的DEBUG_NEW

    学习范例http://www.cppblog.com/Robertxiao/archive/2012/11/05/194547.html 在使用MFC库开发程序时,我非常喜欢MFC框架中的内存泄漏诊断 ...

  7. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  8. (转)win32Application和win32ApplicationConsole

    这几天在创建MFC项目时,常常遇到一下两个连接错误,例如: 1. LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _ma ...

  9. [转载]浅谈C/C++内存泄漏及其检测工具

    http://dev.yesky.com/147/2356147_3.shtml 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如Sm ...

随机推荐

  1. EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551,John是EasyPusher安卓直播推流.EasyPlayer直播流媒体播放端的开发和维护者 ...

  2. Hibernater中的持久化对象以及状态转换

    一.持久化对象的要求 1.提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类. 2.提供一个标识属性(identifier prop ...

  3. asp.net mvc4 之Webapi之客户端或服务器端安全控制

    一.WebAPI的工作方式 WebAPI的工作方式:HTTP的请求最先是被传递到HOST中的,如果WebAPI是被寄宿在IIS上的,这个HOST就是IIS上,HOST是没有能力也没有必 要进行请求的处 ...

  4. java socket InputStream和OutputStream

    从java socket对象获取的InputSteam的read方法其实是对linux的recv()函数的调用,OutputStream也同理. 也就是说,InputStream和OutputStre ...

  5. aop学习总结三----aop的相关概念

    aop学习总结三----aop的相关概念 public Object invoke(Object proxy, Method method, Object[] args) throws Throwab ...

  6. 【LeetCode】Search in Rotated Sorted Array II(转)

    原文链接 http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/ http://blog.csdn.net/linhuan ...

  7. 【Effective C++】让自己习惯C++

    条款01:视C++为一个语言联绑 C++的四个语言层次: C:C++是以C为基础的.基本数据类型.语句.预处理器.数组.指针等统统来自C. Oject-Oriented C++:面向对象这一特性包含了 ...

  8. Java8初体验(1):lambda表达式语法

    原文出处: 一冰_天锦 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化 ...

  9. Android Studio中的“favorites”和“bookmark”

    做项目难免来回查看某个文件的某个方法,某些文件可能访问率很高, 为了加快开发效率楼主推荐使用favorites (文件)bookmark (代码 行). favorites 的添加就在文件单击右键ad ...

  10. table内 获取同一行 其他列的value

    table内  获取同一行 其他列的value function move(obj,ud){ var code = document.getElementById("reportName&q ...