none
进程不能结束,不知道缘由(有过类似经验的programmer帮我看看)。 RRS feed

  • 问题

  • 这个问题一切都来源于自己下面的这个实验。

    具体详细的描述原帖:http://www.cnblogs.com/sisi202/archive/2010/04/11/1709485.html

    MyCommon.h文件内容如下:
    _____________________________________________________________________________

    /*
    
    	common header files.
    
    */
    
    
    
    #ifndef MYCOMMON_H_
    
    #define MYCOMMON_H_
    
    
    
    #ifndef _UNICODE
    
    	#define _UNICODE
    
    #endif
    
    
    
    #ifndef UNICODE
    
    	#ifdef _UNICODE
    
    		#define UNICODE
    
    	#endif
    
    #endif
    
    
    
    #define WINVER 0x0502
    
    #define _WIN32_WINNT 0x0502
    
    
    
    /* c 89. */
    
    #include <assert.h>
    
    #include <ctype.h>
    
    #include <errno.h>
    
    #include <float.h>
    
    #include <limits.h>
    
    #include <locale.h>
    
    #include <math.h>
    
    #include <setjmp.h>
    
    #include <signal.h>
    
    #include <stdarg.h>
    
    #include <stddef.h>
    
    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <string.h>
    
    #include <time.h>
    
    
    
    /* c 95 added. */
    
    #include <iso646.h>
    
    #include <wchar.h>
    
    #include <wctype.h>
    
    
    
    /* c 99 added. */
    
    /*#include <complex.h>*/
    
    /*#include <fenv.h>*/
    
    /*#include <initypes.h>*/
    
    /*#include <stdbool.h>*/
    
    /*#include <stdint.h>*/
    
    /*#include <tgmath.h>*/
    
    
    
    /* windows. */
    
    #include <windows.h>
    
    #include <tchar.h>
    
    
    
    #endif
    
    

    _____________________________________________________________________________

    console.c文件内容如下:

    _____________________________________________________________________________

    #include "../common files/MyCommon.h"
    
    int _tmain( int argc, _TCHAR* argv[], _TCHAR* env[] ) {
    	MessageBox( NULL, TEXT( "Our Process Dead ?\r\n" ), TEXT( "message tips" ), MB_OK );
    	return 0;
    }

    _____________________________________________________________________________

    makefile 文件如下:_____________________________________________________________________________

    all : console.exe
    
    console.obj : console.c
    	cl /nologo /c /MD console.c
    
    console.exe : console.obj
    	link /nologo /entry:wmain console.obj
    clean:
    	del console.obj
    	del console.exe
    	del console.exe.manifest

    _____________________________________________________________________________

    在VC命令提示符环境下,切换到这几个文件的目录,执行了nmake /a命令,生成可执行文件console.exe文件。

    但是console.exe执行过后,console.exe进程不能终止 ??

    我没有去连接crt启动函数,所以就不能能靠crt中的ExitProcess来结束自己。如果这是原因的话,那么为什么下面修改了的console.c源码,编译运行后,console.exe进程却能够正常的终止。修改后的console.c如下:

    _____________________________________________________________________________

     

    #include "../common files/MyCommon.h"
    
    int _tmain( int argc, _TCHAR* argv[], _TCHAR* env[] ) {
    	_tprintf( TEXT( "Our Process Dead ?\r\n" ) );
    	return 0;
    }

    _____________________________________________________________________________

    • 已编辑 何清松 2010年4月18日 11:05 代码块显示不正确
    2010年4月16日 9:10

答案

  • _tmain 是控制台程序的入口点

    int WINAPI WinMain(      

        HINSTANCE hInstance ,     HINSTANCE hPrevInstance ,     LPSTR lpCmdLine ,     int nCmdShow ); 才是Windows 程序的入口点。

    你应该把程序入口点换成WinMain!

    • 已标记为答案 Nancy Shao 2010年4月23日 9:47
    2010年4月19日 3:58
    版主

全部回复

  • 建议重新使用 CODE 功能组织代码, 你现在这样混乱的排版会阻止别人的帮助企图.

    还有一点需要注意的是, MessageBox() 创建的是模态对话框, 在用户确认对话框前该函数不会返回, 程序自然也不会继续执行.

    2010年4月16日 15:48
  • NWinTer,我重新组织好了源代码,再帮我看看吧,我BLOG上有个网友就说是MessageBox会造成阻塞,但是具体什么原因我还是不很清楚。
    2010年4月18日 11:09
  • 那你先把 MessageBox() 换成 Beep() 试试看吧.

    或者在 MessageBox() 后面跟一句 printf() 看看.

    以前没这么折腾过, 如果只指定 /ENTRY 不指定 /SUBSYSTEM 就能跳过 CRTStartup?

    2010年4月18日 12:09
  • 我试过了,在MessaeBox前面或者后面加上Beep和printf都不得行。

    2010年4月19日 0:01
  • _tmain 是控制台程序的入口点

    int WINAPI WinMain(      

        HINSTANCE hInstance ,     HINSTANCE hPrevInstance ,     LPSTR lpCmdLine ,     int nCmdShow ); 才是Windows 程序的入口点。

    你应该把程序入口点换成WinMain!

    • 已标记为答案 Nancy Shao 2010年4月23日 9:47
    2010年4月19日 3:58
    版主
  • MicHael Lee2,你的意思是,在CUI程序里,如果调用MessageBox这个API的话,在MessaegBox执行过后,CUI程序的主线程会被挂起?

    MessageBox在Cui类型程序里,造成的挂起现象纯粹是因为console.exe这个程序的类型是个CUI类型的程序而已?

    我可以这样理解吗?

    2010年4月19日 5:23
  • 深层次的原因,我没有去找。也许是进程类型的问题吧,这得用Windbg 调试一下windows 内核,看看控制台和GUI 的区别。 但你在一个控制台程序里面弹一个windows 的对话框,应该是导致你问题的主要原因。

    好比是一个windows Service 程序,也不可以弹出一个UI给用户一样。

     

    2010年4月19日 5:49
    版主
  • 看来这个问题和OS牵扯的比较多,那就不深究了。
    2010年4月19日 8:33
  • 我试过了,在MessaeBox前面或者后面加上Beep和printf都不得行。

    不是在 MessageBox 前后加, 而是把 MessageBox 换成 Beep.

    我这里没有直接用 makefile, 而是在编译选项里把 /SUBSYSTEM 设置为 not set, 再指定 /ENTRY, 没有能够重现你这个问题.

    另外我觉得 CUI 和调用 MessageBox 应该没什么关系...

    2010年4月19日 15:29