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运行环境下,连接器一般把进入点默认设置为mainCRTStartupWinMainCRTStartup,因为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[])

http://blog.csdn.net/xiaoxin_ling/article/details/3852406