exe、dll的进入点,以及main、winmain、dllmain的关系
来源:互联网 发布:pusher js 编辑:程序博客网 时间:2024/05/18 16:37
exe、dll的进入点,以及main、winmain、dllmain的关系
静态链接的情况不考虑,因为这种情况就是把所有代码合并到exe中,不需要进入点。
进入点就是系统在加载一个可执行代码块(主要是exe和dll)到内存的时候,系统将要调用的起始代码的位置。
加载分为启动时加载和运行时加载,这两种说法主要是针对dll的,因为exe加载必然会创建一个新的进程,所以exe加载都是启动时加载,就算是createprocess也应该说是启动时加载。而dll分为两种情况,第一种就是随着exe的加载一起加载到内存的同一进程地址空间中,另一种则是exe中的代码loadlibrary在运行时加载dll到当前exe的进程地址空间中。
无论上面哪种情况,只要加载,系统就会一定在加载的时候调用进入点代码,所以加载方式与进入点完全不影响。
win sdk文档中exe的进入点有两个,一个是main,另一个是winmain,这个进入点是可以改的,但是在c运行环境下,连接器一般把进入点默认设置为mainCRTStartup和WinMainCRTStartup,因为c运行时需要在代码执行前进行一些别的工作,所以就修改为前面两个c入口点,然后这两个函数再分别调用main和winmain。c运行时需要作的特别工作就是初始化c运行时环境,包括静态、全局变量和对象初始化。当main或者winmain返回时就又回到了前两个函数中,这两个函数的后半部分就是负责清理之前的初始化工作。
win sdk文档中的dll的进入店是dllmain,同样在c运行时下,改为_DllMainCRTStartup,系统加载dll时调用这个函数,然后这个函数做些初始化工作,再调用dllmain,然后返回_DllMainCRTStartup结束执行。此时,dll已经在进程的地址空间中了,该进程的exe可以使用dll中的代码了。如果该dll是启动时加载,那么在程序结束时会再次调用_DllMainCRTStartup进行清理之前dll初始化的工作,如果是通过loadlibrary来运行时加载dll,那么需要exe自己卸载dll,卸载的时候会再次调用_DllMainCRTStartup
http://www.cppblog.com/FateNo13/archive/2009/08/18/93719.html
用过C言语的人都知道每一个C的程序都会有一个main函数,
但有时看别人写的程序却出现了_tmain,会感动很困惑。
我当时也是很困惑,于是上网找资料看。
现在将我得到的结果总结一下。因为并没有什么根据,
如果有误。欢迎指正:_tmain与main的区别
1。 main是C程序的函数,_tmain是main为了支持unicode所使用的main的別名
2。 _tmain的定义在<tchar.h>可以找到,如#define _tmain main,所以要加#i nclude <tchar.h>才能用。
_tmain()是个宏,如果是UNICODE则他是wmain()否则他是main()
3。因此_tmain compile后仍为main,所以都可以执行
main()是WINDOWS的控制台程序(32BIT)或DOS程序(16BIT),
WinMain()是WINDOWS的GUI程序,
wmain()是UNICODE版本的main(),
_tmain()是个宏,如果是UNICODE则他是wmain()否则他是main()
另外,wmain也是main的另一個别名,是为了支持二个字节的语言环境
-----------------------
int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] );
wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] )
int _tmain(int argc, _TCHAR* argv[])
- exe、dll的进入点,以及main、winmain、dllmain的关系
- 静态加载DLL ,main()、main全局变量、dllMain()、dllMain全局变量的一些说明
- WinMain、Main的大小
- DLL 的DllMain函数
- main与WinMain的区别
- main WinMain _tmain的区别
- dll lib exe 的关系
- 程序进入点 WinMain
- dll的基本知识和调用方式以及dllmain
- dll中DllMain的作用
- DLL的DllMain入口函数
- DLL的Dllmain函数讲解
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- 没有DllMain的Dll--哪来的dllMain?
- 传递WinMain的参数给main
- .obj, .lib, .dll, .exe的关系
- .obj .lib .dll .exe的关系
- 做网站出现的bug(二)
- 获取未安装apk的软件包信息
- 南宁百货大楼股份有限公司二 一一年第四次临时股东大会决议公告
- YUI实现JS跨域访问文件、字符串、js
- 如何改变sencha-chart的刻度item显示文字
- exe、dll的进入点,以及main、winmain、dllmain的关系
- It is wrong that some anti-virus software judge DB Query Analyzer as a virus
- AndroidView与SurfaceView的区别
- Struts的logic标签
- Outlook 2010 从磁盘读取一个HTML文件作为Email的Body
- 红帽使用OpenShift PaaS为云中Java提供综合生命周期支持
- 基于TCP协议的网络编程--socket编程(2)
- struts和spring集成时不能加载struts.xml文件的原因
- C#委托的一些应用,个人肤浅的一些操作