说实话题目不太清楚,但是我总有个问题,看了很多资料但是还不明了,总感觉有个答案在眼前了,但是怎么抓都抓不到。而且问题也不是一两句话能说清楚的,但是这些问题都有一个中心
1.比如说我在VC中建立一个WIN32工程,我包含一个  stdio.h的头文件,然后在WinMain 函数里写一个printf函数,编译成功,但是运行后没反应,为什么?还有这个函数的代码是放到EXE文件的PE部分还是DOS部分?
2.还是在VC里,建立一个控制台程序,然后包含windows.h头文件,然后在main函数里面建立一个windows窗口,这个没试过不知道能不能通过,但是我看一本书叫《编程高手箴言》的书里面也用这种方法建立了一个windows程序不知道是怎么回事,按我的理解dos下main函数的代码应该都是写到EXE文件的dos部分而非PE部分,怎么能建立windows窗口的?
3.2中的这个程序我在TC2.0中编译又会怎样?为什么?
4.就在我刚才说的那本叫《编程高手箴言》的书里面写了这么一句话“不要被main函数迷惑了,其实别的名字也是可以的,比如说mymain",这我就有点搞不懂了,为什么主函数也可以是别的名字的?前面的我没看懂,不知道这句话之前还有什么条件。
请各位大大为我解答,小弟谢过

解决方案 »

  1.   

    最后补充一点,VC是怎么判断某个函数代码是应该放进EXE文件的PE部分还是DOS部分的?是通过WinMain函数还是main函数来判断的么?
      

  2.   

    main只是默认的让编译器找到的识别的,其实main可以自己改名的。设置下编译选项就好了
      

  3.   

    windows程序里面可以用CreateWindow创建窗口,可以用AllocConsole(CreateConsole?)创建控制台,或者什么也不显示。
    你学一下汇编,好多细节得东西就会呈现在你眼前。
      

  4.   

    1.printf默认输出到stdout(一般就是那个控制台窗口),WIN32工程不使用控制台,所以就看不到输出;函数的代码编译后放在PE文件(32位Windows上的EXE,DLL都是这种格式)的代码段(.text),关于PE文件结构可以看这里
    http://baike.baidu.com/view/1087038.htm,你说的DOS部分可能是指里面的IMAGE_DOS_HEADER结构
      

  5.   

    楼主,我不得不纠正一下你的问题:
    记住这一点:DOS部分是老版本操作系统遗留下来的,仅为了兼容而已
    我们的MAIN函数代码是放在不同的代码段(即PE节)
      

  6.   

    7楼,那如果我建立控制台应用程序调用printf函数也照样放在PE里面么?
      

  7.   

    1. printf是输出到控制台的,GUI程序默认没有STDOUT,如有需要可以AllocConsole(STDOUT);
    2.不会放那个dos stub头,都是PE的代码段里;
    3.~
    4.默认情况下,模块的ENTRY是mainCRTStartup,winmainCRTStartup或DLLmainCRTStartup,他们会再去调用你的main或者WinMain,可以改变link选择指定的函数作为ENTRY,但是一般都不这么做,xxCRTStartup完成了C/C++ 库的初始化工作,包括静态类对象的构造和析构,用你的函数作为ENTRY这些静态的类对象将得不到构造和析构
      

  8.   

    9L的大哥,第2个问题,是不是说只要是用VC做的都会放进PE?那TC2.0会把printf放进DOS STUB吗?