none
不用ExitProcess能结束进程吗? RRS feed

  • 常规讨论

  • 代码文件如下(Win32Console.cpp) :

    int _tmain(int argc, _TCHAR* argv[], _TCHAR* envp[])
    {
    	return 0;
    }
    
    
    ___________________________________________________________________________________________________________________________________________

    makefile(Win32Console.mak)文件如下 :
    all : Win32Console.exe
    
    Win32Console.obj : Win32Console.cpp
    
    	cl /c /MD /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /D "_BIND_TO_CURRENT_VCLIBS_VERSION" Win32Console.cpp
    
    Win32Console.exe : Win32Console.obj
    
    	link /subsystem:console /entry:wmain Win32Console.obj kernel32.lib
    
    

    ___________________________________________________________________________________________________________________________________________
    执行nmake /a win32console.mak , 然后执行dumpbin /disasm Win32Console.exe, 结果如下:
    F:\ProgrammingWorkspace\VC++\CommandLine\Win32Console>dumpbin /disasm win32console.exe
    
    Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    Dump of file win32console.exe
    
    File Type: EXECUTABLE IMAGE
    
      00401000: 55                 push        ebp
    
      00401001: 8B EC              mov         ebp,esp
    
      00401003: 33 C0              xor         eax,eax
    
      00401005: 5D                 pop         ebp
    
      00401006: C3                 ret
      Summary
            1000 .data
            1000 .text
    
    

    我最小化了这个程序的大小, 没有去连接crt 的启动函数,但是看着反汇编有个疑问.
    当我执行win32console.exe的时候, 操作系统的加载器会加载到内存并执行, 随之而来的是Window os会创建一个进程来启动win32console.exe, 还有一个主线程来执行win32console.exe文件的可执行码, 疑问就是win32console.exe的执行吗没有调用ExitProcess来结束本自己, 那么在执行完ret这句代码后, OS怎么知道此程序就已经结束了??

    本人操作系统学得不好, 大家能个帮忙开导下.
    2010年1月9日 7:18

全部回复

  • 你用IDE或者其他工具来按句调试,就可以清楚地看到return后Windows又作了什么。调用的exit(0)结束的进程。


    我的代码在这个路径下C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\crtexe.c

    0xBAADF00D
    2010年1月9日 16:45
    版主
  • 我的makefile已经设置了/entry:wmain ,我的可执行文件没有去链接启动函数,生产出来的可执行文件很小,而且能运行。

    可执行文件的可执行代码很少,就上面那反汇编的那几句,我就不明白OS加载了该可执行文件后,执行上面的反汇编代码后,并没有调用ExitProcess,那么OS怎么知道,判定,和结束win32console.exe这个进程呢?
    2010年1月10日 6:15
  • 结束自己不用用ExitProcess也行,主线程返回就可以了.


    0xBAADF00D
    2010年1月11日 14:09
    版主