今天看了孙鑫老师的VC++教程,认为孙老师windows程序运行原理一章讲的很棒,解决了困扰我很久的一个问题:回调函数的调用过程。现在在这里回顾一下要点:
WINDOWS application 是基于消息机制的,大体过程如下:
1. application运行,OS为application建立消息队列;
2. 某个事件或用户行为发生,OS捕获后,以MSG的结构包装,扔到相应的程序的消息队列;
3. 在application的消息循环中,先GetMessage(), 再TranslateMessage(), 然后再DispatchMessage();
4. 被DispatchMessage()的消息MSG先被OS获得,然后OS解析MSG的内容,获得MSG的HWND, message , wParam, lParam等相关的数据,然后以这些数据作为参数,调用application的窗口类指定的回调函数,对消息进行相应。
5. 消息循环不断的GetMessage,直到获得WM_QUIT的消息,循环结束,程序执行完毕,退出!
注意:DestroyWindow 和 PostQuitMessage的区别,窗口销毁后程序依然执行;但是PostQuitMessage后,OS发出WM_QUIT类型的消息,WM_QUIT被dispatch后,程序结束。

姚鑫
2011/8/11
深夜于大运村舍内
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sorgin/archive/2009/08/11/4436449.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sorgin/archive/2009/08/11/4436449.aspx

win32application与win32 console application区别何在

默认分类   2009-07-22 09:54   阅读21   评论0  

字号: 大大  中中  小小

Win32      application      是基于WINDOWS平台的32位开发环境开发应用程序,SDK程序。
Win32      Console      application      是基于DOS开发平台开发应用程序,不能使用与图形有关的函数,控制台程序。

1.EXE文件本身有区别:在文件头里(PE头)有一个标记表明该文件是Application还是Console

2.OS在创建对应的进程时,如果是Console,除了载入文件映像并开启进程外(这一点和Application相同),同时创建一个Console对象(就是那个黑黑的窗口)与之关联,而且这种关联是可以编程脱开的.

除此以外,就没什么区别了,在Console程序里调用相应的API也可以创建窗口,对话框什么的

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Win32 Application和Win32 Console Application 
都是工作在32位Windows环境的程序。

其中Win32 Application 
就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的、不规则形状的…… 
它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。

而 
Win32 Console Application(win32控制台应用程序) 
往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它; 
或者叫CUI(Character User Interface字符用户接口)。

vc6里Win32 Application和Win32 console Application的区别

很多VC初学者可能会常遇到如下链接错误: 
Linking... /subsystem:windows 
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

Debug/TestWin.exe : fatal error LNK1120: 1 unresolved externals 
Error executing link.exe.

解决方法是:将project-settings-link的project options里的

/subsystem:windows 
改成 
/subsystem:console



 
1.define mouse click message event
    case WM_LBUTTONDOWN: // WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBCLICK
                                        break;
2.catch cursor position
  int x_pos, y_pos;
  x_pos = LOWORD(lParam);
  y_pos = HIWORD(lParam);
3. print mouse cursor position by messagebox()
TCHAR dst[20];
wsprintf(dst, TEXT("(%d, %d)"), x_pos, y_pos);
messageBox(NULL, dst, L"Message", MB_OK);

JUST LIKE THIS!
J.Y
 
dxut 框架依次执行IsD3D9DeviceAcceptable(), ModifyDeviceSettings(), OnD3D9CreateDevice(),OnD3DResetDevice() 四个函数,接下来看看MSDN对以上几个函数的评述:
1.Customize Device Settings in the IsDeviceAcceptable callback
To help DXUT choose the best device settings, use the IsDeviceAcceptable callback function  (either DXUTSetCallbackD3D9DeviceAcceptable or DXUTSetCallbackD3D10DeviceAcceptable) to filter out any settings that are not appropriate for your application.Within the callback function, the application can reject any combination that it does not support or want by returning false in the callback. For instance, this example rejects 16-bit back-buffer formats and devices that do not support at least pixel shader model 2.
bool CALLBACK IsD3D9DeviceAcceptable(
   
D3DCAPS9*     pCaps,
   
D3DFORMAT     AdapterFormat,
   
D3DFORMAT     BackBufferFormat,
   
bool          bWindowed
)
{
    if( BackBufferFormat == D3DFMT_X1R5G5B5 ||
BackBufferFormat == D3DFMT_R5G6B5
)
        return
false;
    if( pCaps->PixelShaderVersion <
D3DPS_VERSION(2,0) )
        return
false;

    return true;
}

2. Change Device Settings in the ModifyDeviceSettings callback
After choosing the best settings, there is one more callback that DXUT uses which can be used to modify the settings. This is the ModifyDeviceSettings callback function. This callback function takes a DXUTDeviceSettings structure.  This structure is a union of DXUTD3D10DeviceSettings and DXUTD3D9DeviceSettings.  It contains everything needed to create a device.  The ver field of the structure indicates whether the settings structure is for a Direct3D 9 or Direct3D 10 device.
3. onD3D9CreateDevice()
创建设备之后,接下来调用OnD3D9CreateDevice() callback, 在此函数中创建内存池类型为D3DPOOL_MANAGED 或者 D3DPOOL_SYSTEMMEM资源。以类型D3DPOOL_MANAGED创建的设备由Direct3D系统代替管理(位于显存或系统内存中),以类型D3DPOOL_SYSTEMMEM创建的设备位于系统内存中,在程序退出之前,这些资源常驻内存,不会出现设备丢失的现象。也就是说,以这两种内存类型创建的资源不需要程序员进行管理。
4.OnD3D9ResetDevice()
DXUT框架在调用OnD3D9CreateDevice()回调函数之后,将调用OnD3D9ResetDevice()回调函数。我们可在函数OnD3D9ResetDevice()中创建所有内存池类型为D3DPOOL_DEFAULT的资源,这一类资源将尽可能存放在显存中,这样可以提高程序的运行速度。但是,这类资源在程序运行时会出现设备丢失的现象,因此需要程序员自己管理。在设备丢失时释放它的内存,当设备恢复时重新为它分配内存。此外,观察变换矩阵和投影变换矩阵以及在整个程序运行期间保持不变的渲染状态通常也在该回调函数中设置。






 
L"string" represents string decoded with Unicode, a data type of const WCHAR *, 16 bits
_T"string" is related to _UNICODE micro definition, if _UNICODE exists, _T"string" is same to L"string", else the result is like common string data type.
2011/4/29
jack.y
 
最明显的区别:
main是dos的C程序入口
winmain是windows的程序入口,也就是GUI的程序入口
wmain用于Unicode, wWinMain是unicode版,WinMain , main 是ANSI版,若要有中文,则使用wWinMain, 也可以使用_tWinMain.
dllmain 是DLL的程序入口.
2011/4/29
 
在windef.h头文件中有如下定义
#define   WINAPI                  __stdcall
#define
   APIENTRY            WINAPI

VC有两种函数调用方式   一种是__stdcall,另一种是__cdecl

函数的调用方式有两种一种是PASCAL调用方式,另一种是C调用方式
使用PASCAL调用方式,函数在返回到调用者之前将参数从栈中删除

使用C调用方式,参数的删除是调用者完成的
WinMain函数是由系统调用的,Windows系统规定由系统调用的函数都遵守PASCAL调用方式

但是VC中函数的缺省调用方式是__cdecl,也就是C调用方式
所以在WinMain前显示的声明。

在Windows编程中将遇到很多声明修饰符,如CALLBACK,WINAPI,PASCAL这些在IntelCPU的计算机上都是__stdcall

详细的声明细节请看windef.h文件      
2011/4/29
 
每到年底各大媒体就争先恐后热火朝天地搞总结,什么十大人物,十大品牌,十大美女,十大帅哥等等五花八门乱七八糟的让人充满好奇充满怀疑,这事确实让人有点郁闷,就如同男足国家队的国产教练如沉墙扶们每一次踢球失败后都要说这么一句:我们回去后要好好总结,下次会打得更好! 这话听了几十年了,耳朵都生虫了,但还是无法看到中国猪球队有象人样的表现。因此,总结在某一程度上来说只不过是一种形式罢了,总结不代表就能改过原有的不足,也不代表就能进步了,甚至有点俗不可耐,尽管如此,阿蒙亦明知故俗,前人说过了入乡了就要随俗,因此你生活在这种环境里,你无法对这些无聊无趣的东东置之不理,除非你是天才,天才往往在非天才的人看来是很怪异的,处处与现实格格不入,可阿蒙不是天才,所以还得赶快总结,要不就离题,又被大家骂了,:) 

  (一)充分利用MSDN,因为我个人觉得它胜过任何一本编程参考书; 

  MSDN是 Microsoft 当前提供的有关编程信息的最全面的资源,它包含微软最新的技术数据库,加上易学易用的全文检索功能,让您迅速找到任何您需要的技术参考数据,让您随时拥有与全世界菁英同步的技术,掌握最丰富的程序开发资源。我经常收到很多朋友的EMAILS,他们所提的问题往往都非常的简单,MSDN完全可以解答这些问题,但他们好象不太喜欢用,这是让我郁闷的地方,是因为英文不好呢,还是没有学会充分利用各种资源来解决问题的方法呢? 

  (二)提高英文水平,养成多上英文网站多看英文资料多买老外原版英文书; 

  有关程序员与英文水平的讨论已太多太多, 我个人认为要成为程序员,高中的英语水平够了,甚至不懂英语的一些人,也同样可以成为较好的程序员,因为开发工具的发展将是越来越傻瓜,但如果你是仅仅满足于能运用某种工具开发某个软件模块,那是没话说了。真正热衷技术肯乾钻研乐于接受挑战的程序员是不满足于现状的,他们总感觉有太多的未知,于是总在不停地学习,如今信息技术发展得太快,而大部分的技术最先出现的时候都是英文版本的,要几个月或者几年以后才有中文版本的书出来,因此要想跟上步伐,一定要努力提高自己的英文水平,这样才能同步跟上信息技术。你可能担心自己的英语水平不行,没关系,刚开始多查字典,“万事开头难”,必须有持之以恒的精神,不久你就会发现计算机英语其实很容易的。何况很多 

  英文技术站点确实比国内做得好啊!比如http://www.codeguru.com,http://www.codeproject.com,http://www.programmersheaven.com 等等。 

  (三)加强自我管理,善于作自我总结,分析自已的优点及缺点。 

  中国境内百分之八十以上的领导人在百分之八十以上的场合的讲话中都有类似的观点,所以在这里我是不多说了,反正这一条用在什么行业什么地方都不会有错的,人生最大的敌人不是就是自已吗?管好自已认清自已,那还有什么搞不定的? 

  (四)养成良好的文档习惯 

  程序员大多都不喜欢写文档,我以前也是特讨厌,在我的思想里,所谓的文档就是一些废话,一句话硬是用十句话来代替的无聊透顶,就如同部分中文系男生的爱情表白,明明就是“我爱你”三个字,他硬是把月亮啊太阳啊大海啊高山啊石头啊天使啊乱七八糟的都拉上关系了,尽管听起来浪漫,但在我认为不实用,:), 甚至太肉麻了,一个男子汉乾嘛这么罗里罗嗦的……良好的文档是正规研发流程中非常重要的环节,一个好的程序是先写好设计文档再进行编程的,在设计文档的指导下,才能写出安全的代码。如果你不写文档,一开始就写程序,这样你就不会按已设计好的路线走,而是想到哪写到哪。小功能还好说,要是大功能,就容易混乱甚至失控。那么如何写文档呢?其实我认为没有统一的标准,虽然国家及一些NB的人总结了很多的模板,但每个人的习惯不同,如果你不加以修改或创新,就套用某个标准,我相信写起来会很吃力及说不清的难受,因此我觉得只要能将你的设计思想及实现算法或步骤描述清楚就是好的文档,我强烈建议广大程序员朋友们在写文档时要善于用图表来说明你的思想,我们不是作家,也可能作文都经常性地不及格,写出五官端正的文章对我们来说可能不容易啊!好好地利用VISIO,ROSE或别的工具来表达你的思想吧!
(五)代码风格要规范,严谨,效率要高。 

  这个不用说了,所以一定要记住了!不过,这一点有时可能与人的性格有关,如果你是经常丢三落四经常胡子长长经常钮扣扣错经常吃个快餐要一个小时的人,那你在CODING的时候可千万要注意了,CODING是CODING,生活是生活,不要写出的程序也是那样就不好了! 

  (六)掌握好跟踪调试技巧。 

  跟踪调试程序是一件繁琐而又复杂的事情,所以掌握必要的调试策略及技巧却可以使这些工作变得轻松起来。强烈建议你去看一下老美Everett N。McKay及Mike Wooding写的书<<Debugging Windows Programs>>,你一不定受益匪浅。 

  (七)养成自我测试的习惯 

  测试工作应由测试工程师来做,但在你写完一个模块或一个软件时,还是要自已先测试一下,保证不要出现一些低级的错误,何况这些错误让测试工程师看到了,狂扁你一顿,你很没FACES的。 

  (八)善于交流善于沟通,特别是经常与一些高手交流一下学习的心得体会; 

  有人说,程序员的性格大多内向不喜欢说话,其实是有些误会了,不是不喜欢而是话不投机,我的脑袋一天到晚都在不停地转,函数,数据,算法啊充满了我的世界,我那还有时间与你谈一些无聊的话题,话要找对人了,才容易谈下去,书上说过“听君一席话,胜读十年书”,你要找的就是这种豁然开朗!现在技术的论坛越来越来,这将成为程序员交流一个重要的地方,也有人说:“读君一长贴,胜读十年书”,:) 

  (九)阶段性地做一下专题总结 

  知识要温故而知新,因此我建议程序员要养成阶段性地做专题总结的习惯,比如你这个月学习或在做与多线程有关的模块或项目,那么在你做完后,你就可以好好地总结一下所有与多线程相关的技术,包括理论知识,实践方法以及各种技巧及优秀文章等等,这对你各种能力的提高将有很大的帮助,你试过了吗,如果没有,那就快点行动吧! 

  (十)要有持之以恒的精神 

  这是废话,因为我揍不齐十大,所以将它也算上,中国自古以来喜欢号召大众学习某种精神,比如马克思的,列宁的,毛泽东的,邓小平的,雷峰的等,这些精神使社会更安定人民生活更美好,那么程序员要有什么样的精神呢?我不是我说了就算了的,我只是想说明要学好任何一门技术,最好要有持之以恒精益求精的精神,特别是学一些比较抽象比较难的技术,比如VC++,我想它应比别的开发语言都要难学些,或许你已经开始了两年了,但感觉还是不爽仿佛也没掌握什么,这个时候你除了思考一下你的学习方法以外,还必须坚定你的目标及信念!