首页
社区
课程
招聘
[求助]Win32汇编退出程序为什么要使用ExitProcess()?
发表于: 2010-8-6 23:14 7947

[求助]Win32汇编退出程序为什么要使用ExitProcess()?

2010-8-6 23:14
7947
问题的发生是因学习编程时,采用了网传的/nodefaultlib方式编译,结果在某些版本的XP上出现了程序关闭而进程无法退出的现象,而放弃/nodefaultlib编译的程序又恢复正常(现仅发现E文版XP上有这问题,且同一个程序某次初安装系统运行正常,打了一些补丁后就出现问题)。最后借鉴Win32汇编程序的ExitProcess()退出程序。

我想问的是C的程序的一般流程是WinMain中Register class,创建窗口,然后DispatchMessage(),最后只要return messages.wParam就可以了,保证退出的话在窗口过程中处理WM_DESTROY:PostQuitMessage()。
这和汇编的流程几乎是一样的,除了汇编一般用ExitProcess()退出,为什么一般情况下C下不用这个也能正常退出进程?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没看明白什么意思。
2010-8-6 23:36
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
要知道,一个进程中的所有线程都退出了,系统才会回收进程的资源,即进程才会结束。你写的代码执行完了,只能表示主线程退出了,不能代表所有线程都退出了。如果不想使用ExitProcess,就自己清理吧。
2010-8-7 01:40
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
C也用了TernimateProcess函数,只是你看不到而已,呆到程序退出时你跟进去就知道了,只是这个事情是编译器帮你做了而已,跟进去发现退出是exit函数……
2010-8-8 23:10
0
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
5
系统默认的只会给程序的主线程结束后调用exitthread而不是exitprocess。但c的maincrt头在调用 main ()后紧跟着一个 exit () 所以是正常的
2010-8-9 01:27
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
似乎明白了,但是无法解释同一个程序(/nodefaultlib编译,程序中不使用类似的退出函数),在不同的XP下有的进程能正常退出,有的出现问题的现象,不知是否有解...
2010-8-9 21:01
0
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
7
/nodefaultlib 代表不显示链接msvcrt之类的库。这样我记得exit会用vc里面的crt源代码编译到程序里。有的进程正常退出,有的不能正常退出,是不是因为你自定义的程序的入口点?其实自己进程序入口点看一下就了解了。
2010-8-9 22:40
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
小白还是,不会看!确实自定义了入口点,比如:
#include <windows.h>
#include <commctrl.h>

#pragma comment(linker, "/nodefaultlib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "comctl32.lib")

#pragma comment(linker, "/OPT:NOWIN98")
#pragma comment(linker, "/ENTRY:WinMain")

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  HWND hWinMain;
  MSG stMsg;
  WNDCLASS stWndClass;
  
  stWndClass.cbClsExtra = 0;
  stWndClass.cbWndExtra = 0;
  stWndClass.hbrBackground = (HBRUSH)(GetStockObject(LTGRAY_BRUSH));
  stWndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
  
  hInstance = GetModuleHandle(NULL);
  stWndClass.hIcon = NULL;
  
  
  stWndClass.hInstance = hInstance;
  stWndClass.lpfnWndProc = WndProc;
  stWndClass.lpszClassName = "NoExit_test";
  stWndClass.lpszMenuName = NULL;
  stWndClass.style = 0;

  if(!RegisterClass(&stWndClass))
  {
      return FALSE;
  }
  
  hWinMain = CreateWindow("NoExit_test", "NoExit_test App.", WS_OVERLAPPEDWINDOW, 100, 100, 600, 400, NULL, NULL, hInstance, NULL);
  
  ShowWindow(hWinMain, SW_SHOW);
  UpdateWindow(hWinMain);

  while(GetMessage(&stMsg, NULL, 0, 0))
  {
    TranslateMessage(&stMsg);
    DispatchMessage(&stMsg);
  }
  return stMsg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch(uMsg)
  {
    case WM_CREATE:
             InitCommonControls();
             break;

    case WM_DESTROY:
             PostQuitMessage(0);
            //ExitProcess(0);
            break;

   //case WM_CLOSE:
             //DestroyWindow(hWnd);
             //break;

    default:
             return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
  return 0;
}

按以上方式在VC6下编译。
另外,并非"有的程序能正常退出,有的不能正常退出",而是"按以上方式编译的程序,在不同的XP下,要么都能正常退出,要么都无法退出进程,而且现在仅发现不能退出的XP为E文版",另外还出现过"刚装的E文XP此类程序运行正常,打了补丁就范毛病了"
不知是我叙述有问题还是...
2010-8-10 19:35
0
雪    币: 1596
活跃值: (25)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
ExitProcess相当于强退
2010-8-12 16:42
0
游客
登录 | 注册 方可回帖
返回
//