关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?
来源:互联网 发布:格式工厂 mac 注册码 编辑:程序博客网 时间:2024/05/02 04:37
转自http://blog.sina.com.cn/s/blog_842bf5cd010177f8.html
http://topic.csdn.net/t/20010930/15/308713.html
答:main()是WINDOWS的控制台程序(32BIT)入口或DOS程序(16BIT)入口,
WinMain()是WINDOWS的GUI程序入口,
wmain()是UNICODE版本的main(),
_tmain()是个宏,如果是UNICODE则他是wmain()否则他是main()
呵呵,看下面这篇博文,发现程序入口点并没有我原先想象的那么简单
可执行程序的入口点在那里?
http://blog.163.com/lyzaily@126/blog/static/4243883720091053548157/
今天终于有时间来研究一下一个很大很大的工程编译成一个exe和若干dll后,程序是如果执行它的第一条指令的?操作系统以什么规则来找到应该执行的第一条指令(或说如何找到第一个入口函数的)?
我读了MSDN里面的讲解才弄出点眉目了,其实我们以前所写的以main()函数开始的程序都是一个半成品,剩下的也是与系统息息相关的工作由编译器帮我们代劳了。怎么回事呢?编译器是如何帮我们代劳的呢?那么程序被系统加载时,准确的说是被系统中的加载器加载时又是如何知道编译器在我们写的程序上做了手脚呢?难道编译器和加载器之间有什么协定吗?这一些列的问题,做为刚入行的你是否在心里问过自己没有!?
(1)mainCRTStartup(或 wmainCRTStartup)
(2)WinMainCRTStartup(或 wWinMainCRTStartup) //使用 /SUBSYSTEM:WINDOWS 的应用程序
(3)_DllMainCRTStartup
其中w开头的函数时unicode版本的,分割符‘//’后面的是入口点函数匹配的subsystem(msdn中查看subsystem)属性设置。
如果未指定 /DLL 或 /SUBSYSTEM (也就是subsystem选项)选项,则链接器将根据是否定义了 main 或 WinMain 来选择子系统和入口点。 函数 main、WinMain 和 DllMain 是三种用户定义的入口点形式。
在默认情况下,如果你的程序中使用的是main()或_main()函数,这链接器会将你的使用(1)中的函数连接到你的exe中;如果你的函数是以WinWain()函数开始的则连接器使用(2)中的函数连接进exe中;如果我们写的是DLL程序这连接进DLL的是(3)中的函数。
先摘录一段msdn的解释如下:
When you link your image, you either explicitly or implicitly specify an entry point that the operating system will call into after loading the image. For a DLL, the default entry point isDllMainCRTStartup. For an EXE, it is WinMainCRTStartup. You can override the default with the /ENTRY linker option. The CRT provides an implementation for DllMainCRTStartup,WinMainCRTStartup, and wWinMainCRTStartup (the Unicode entry point for an EXE). These CRT-provided entry points call constructors on global objects and initialize other data structures
大家看到了吧,上面我用红色标志了吗,我们可以使用链接器的链接选择来设置我们的函数入口点,但是最好不要这样做,原因就是我用蓝色标志的地方,如果我们重新设置入口点函数,则必须要在入口点函数中自己写上有关的初始化工作,这样岂不麻烦,所有我们最好用默认的入口点函数。
修改入口点方法:proerties->Linker->Advanced->EntryPoint
如果函数与链接器的SubSystem的属性要一致的:
proerties->Linker->System->SubSystem
如果未指定 /DLL 或 /SUBSYSTEM 选项,则链接器将根据是否定义了 main 或 WinMain 来选择子系统和入口点。 函数 main、WinMain 和 DllMain 是三种用户定义的入口点形式。
给出一篇博文,该博文讲的比较好:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=455591
设有一个Win32下的可执行文件MyApp.exe,这是一个Win32应用程序,符合标准的PE格式。MyApp.exe的主要执行代码都集中在其源文件MyApp.cpp中,该文件第一个被执行的函数是WinMain。初学者会认为程序就是首先从这个WinMain函数开始执行,其实不然。
- 关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?
- 关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?
- 关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?
- _tmain main wmain WinMain
- _tmain与main,winMain,wmain
- _tmain与main,winMain,wmain收藏
- main(),_tmain(),WinMain(),wmain()四个函数区别
- _tmain与main,winMain,wmain收藏
- 关于main和_tmain和wmain的区别
- Python3.1.2:wmain,main,_tmain的区别
- main(), _tmain(), wmain(), wWinMain(), _tWinMain()的区别
- main WinMain _tmain的区别
- _tmain(),wmain与main函数
- _tmain,main,wmain三者区别
- 主函数 main WinMain _tmain _tWinMain 的区别
- 主函数 main WinMain _tmain _tWinMain 的区别
- 主函数 main WinMain _tmain _tWinMain 的区别
- 主函数 main WinMain _tmain _tWinMain 的区别
- STL set map容器
- stdarg.h详解
- 再谈Dell-EMC并购:Dell的终极目标是什么?
- TOMCAT ssl 强制访问设置
- Android校验类积累
- 关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?
- Android中用手势的双击事件实现图片单击放大效果
- 使用commandfield删除、修改gridview
- UIView动画和定时器
- Android实体类生成工具
- 56.Oracle数据库SQL开发之 高级查询——使用DECODE函数
- win10和Linux双系统怎么在win10下用EasyBcd卸载Linux系统
- 数据结构例程——每对顶点之间的最短路径
- UITableView如何让cell的分割线左边不缩进