我来我网
https://5come5.cn
您尚未
登录
注册
|
菠菜
|
软件站
|
音乐站
|
邮箱1
|
邮箱2
|
风格选择
|
更多 »
vista
鍙よ壊涔﹂
card
wind
绮夌孩濂抽儙
帮助
统计与排行
无图版
我来我网·5come5 Forum
»
电脑技术
»
程序员之家
»
Windows编程基础
交 易
投 票
本页主题:
Windows编程基础
显示签名
|
打印
|
加为IE收藏
|
收藏主题
|
上一主题
|
下一主题
2004
∷
性别:
∷
状态:
∷
等级:
品行端正
∷
发贴:
222
∷
威望:
0
∷
浮云:
1107
∷
在线等级:
∷
注册时间: 2006-09-25
∷
最后登陆: 2011-10-25
【
复制此帖地址
只看此人回复
】
5come5帮你背单词 [
temptation
/temp'tei
∫
ə
n/
n. 引诱,诱惑,迷人之物,诱惑物
]
Windows编程基础
上面的题目带有“黑客”两个字,请大家别误会了,其实没有多少是讲黑客的,这完全是一篇菜鸟级的编程杂谈,
如果您已是高手,就不必在此浪费时间了 。
前几天在网上看了“病毒”兄写的《WIN下编程须知》一文,觉得在编程方面要写出一篇适合初学者们看的入gate级
文章的确很重要,可惜病毒兄只在该文里介绍了线程、消息、句柄等几个基本概念。很多初学者看了对编程还是感到很
迷惑,一个从来没有写过程序的人如何入gate?如何在短时间内写出自己的程序来?笔者带着这些问题写了这篇文章。这
也是笔者在学习编程的初期所遇到的困惑,在此根据笔者的个人理解将其整理成文,希望能引起广大菜鸟们的共鸣,对
初学者们有所帮助。
从理论上说,任何一gate语言都可以在任何一个系统上编程,只要找到该系统提供的“接口”和对系统内部机制有深
入的了解就可以了,至少我是这么认为的。正如c语言可以在windows下编程,也同样可以在Linux上大放异彩一样。
编程是一项很繁杂的工作,除了应用编程工具之外,了解系统本身内部工作机理非常重要,这是你写出稳定兼容的
程序所必不可少的前提条件。你要在哪一种系统上编程就要对该系统的机制进行研究,至少你应该知道一个程序在那个
系统上是如何运行的。
一、了解Windows 内部机制
Windows 是一个“基于事件的,消息驱动的”操作系统。
在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会
触发一个相应的“事件”。系统每次检测到一个事件时,就会给程序发送一个“消息”,从而使程序可以处理该事件。
每个Windows 应用程序都是基于事件和消息的,而且包含一个主事件循环,它不停地、反复地检测是否有用户事件发
生。每次检测到一个用户事件,程序就对该事件做出响应,处理完再等待下一个事件的发生。
Windows 下的应用程序不断地重复这一过程,直至用户终止程序,用代码来描述实际上也就是一个消息处理过程
的while循环语句。
下面便简单介绍一下与 Windows 系统密切相关的几个基本概念:
⒈窗口:这是我要说的第一个概念。似乎是地球人都知道的事儿了,窗口是Windows本身以及Windows 环境下的
应用程序的基本界面单位,但是很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫
窗口。其实窗口的概念很广,例如按钮和对话框等也是窗口哦,只不过是一种特殊的窗口罢了。
从用户的角度看,窗口就是显示在屏幕上的一个矩形区域,其外观[屏蔽]于应用程序,事实上它就是生成该窗口
的应用程序与用户间的直观接口;从应用程序的角度看,窗口是受其控制的一部分矩形屏幕区。应用程序生成并控
制与窗口有关的一切内容,包括窗口的大小、风格、位置以及窗口内显示的内容等。用户打开一个应用程序后,程
序将创建一个窗口,并在那里默默地等待用户的要求。每当用户选择窗口中的选项,程序即对此做出响应。
⒉程序:通常说的程序都是指一个能让计算机识别的文件,接触得最多的便是.exe型的可执行文件,这个不难
理解。
⒊进程:说到进程,学过《操作系统》的人都很清楚,所谓进程就是应用程序的执行实例(或称一个执行程序)
需要注意的是:进程是程序动态的描述,而上面说到的程序是静态的描述,两者有本质的区别。举个例子,从网上
Down了一个瑞星杀毒软件到C盘但没有运行,那个.exe 可执行文件叫做程序,它是一个二进制码的文件。一旦双击
了exe文件图标运行程序,那个“正在运行着的瑞星杀毒”便称为进程,它在双击的那一刻被系统创建,当你关机
或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到
“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管你的机器是否启动。
⒋线程:线程是进程中的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一
堆栈。进程本来就具有动态的含义,然而实质上是通过线程来执行体现的,从这个意义上说,Windows 中进程的动
态性意义已经不是很明显了,只算是给程序所占的资源划定一个范围而已(个人观点,纯属个人理解,不必引起争
议!),真正具有动态性意义的是线程。以前在大二学习操作系统课的时候就有个同学跟笔者提起这点,笔者还跟
他驳得面红耳赤呢!现在想想,觉得很有道理,不得不佩服那位同学对Windows内部机制了解得如此清楚。
之所以在此花那么多的篇幅说线程,是因为下面将要介绍到多线程编程技巧,如果不理解这点,那就很难应
用到实践上,希望大家明白。
⒌消息:我们几乎做每一个动作都会产生一个消息,在用鼠标指点江山的今天,鼠标被移动会产生WM_MOUSEMOVE
消息,鼠标左键被按下会产生WM_LBUTTONDOWN的消息,鼠标右键按下便产生WM_RBUTTONDOWN消息等等。所有的这些都
可以通过GetMessage,SendMessage等函数得到,以后的操作中我们会经常接触到这些函数。
⒍事件:何谓事件?从它的字面意思我们就可以明白它的含义,如在程序运行的过程中改变窗口的大小或者移动
窗口等,都会触发相应的“事件”。
⒎句柄:单单一个“柄”字便可以解释它的意思了,我们天气热摇扇子的时候只要抓住扇柄便可以控制整个扇子
的运动了,在程序中也差不多是这个意思。通常一个句柄就可以传递我们所要做的事情。有经验的读者肯定清楚,编
写程序总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中
被视为不同类型的对象,用不同的句柄将他们区分开来。
看看C++ 教材中是如何给句柄下定义的:“在Win32里,句柄是指向一个无值型对象(void *)的指针,是一个4
字节长的数据”。虽然我对它的本质是什么还是很迷惑,但我知道句柄并不是一个真正意义上的指针。从结构上看,
句柄的确是一个指针,尽管它没有指向用于存储某个对象的内存位置(很多书都这么说,这正是我的迷惑所在),而
实际上句柄指向的是一个包含了对该对象进行的引用的位置。在编程时,只要抓住了对象的句柄就可以对该对象进行
操作了(我在《一个简单木马程序的编写与伪装策略》中说到的对QQ密码的截获就是要找到QQ登陆窗口的句柄后才开
始截密行动的)。下面再举个例子来说明句柄的运用:编一个程序,使QQ登陆窗口的号码框和密码框均变黑,相关代
码及解释:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
HWND hCurWindow,HC,HE;//定义三个窗口句柄变量,hCurWindow用于存放QQ用户登陆窗口的句柄,HC、HE分别存放
//号码框和密码框的句柄。
if((hCurWindow= FindWindow(NULL,"QQ用户登录"))!=0||(hCurWindow=FindWindow(NULL,"OICQ用户登录"))!=0)
{//很明显,调用FindWindow()函数去获得QQ登陆窗口的句柄
String str;
str.sprintf("0x%x",hCurWindow);
}
TCHAR wClassName[255];//类名变量
HC=GetWindow(hCurWindow, GW_CHILD);//得到号码框的句柄
HE=GetWindow(HC, GW_HWNDNEXT);//接着得到密码框的句柄
GetClassName(HE, wClassName, sizeof(wClassName));//得到类名
GetClassName(HC, wClassName, sizeof(wClassName));//得到类名
EnableWindow(HE,false);//使窗口失效
EnableWindow(HC,false);//使窗口失效
}
以上代码在C++ Builder下编译通过,只要运行次程序,QQ登陆窗口的号码框和密码框马上变黑色,无非是
EnableWindow()函数所起的作用。
你还可以添加一个Timer控件,将上面的代码copy到void __fastcall TForm1::Timer1Timer
(TObject *Sender)函数中,并在后边加上这一句代码:
SendMessage(hCurWindow,WM_CLOSE,0,0); 使QQ一启动就关闭,让别人永远也用不了QQ,挺有趣儿的哦:).
⒏API与SDK:API是英文 Application Programming Interface 的简称,意为“应用程序接口”,泛指系
统为应用程序提供的一系列接口函数。其实质是程序内的一套函数调用,在编程的时候可以直接调用,而不必
知道其内部实现的过程,只知道它的原型和返回值就可以了,此外,手头经常放着一本“Windows API大全”之
类的书也是必不可少的,不然你根本不知道哪些API是干什么用的,瞎编也编不出什么东西来。在后面我们会介
绍调用API编程的例子,调用API编程工作虽然烦琐,但由于API函数都被封装在dll库里,程序只有在运行的时
候才调用的,因此程序的体积小而且运行效率高。
SDK是英文 Software Development Kit 的缩写,指“软件开发工具包”,在_blank">防火墙的设计中就经常涉及到
SDK。
有关基本的概念就谈这些,那些C/C++的基本语法、什么是面向对象等知识请大家查阅相关的书,此类书
籍各大书店已汗牛充栋,不再多叙。下面直接谈谈语种和编程工具的选择问题,这也是初学者们最迷惑的问题。
二、编程语言以及工具的选择:
从上面的介绍我们对Windows 有了进一步的了解,现在就该开始行动了,选择要学的语言和工具是第一步
,而且是非常重要的一步工作,笔者建议一切以简单、易接受为原则,不然你会自信心大减的,何必偏要跟
自己过不去自讨苦吃呢?
在开始的时候很多人都感到迷惑,目前的编程语言那么多,有c、c++、c#、java、汇编、html等等,究
竟学哪些好呢?最开始我该学什么呢?甚至有人将vc、c++ builder也列为两种不同的语言!这些都是对编
程语言缺乏了解造成的。笔者开始的时候也犯过同样的错误,曾经给自己写过一份计划书:先学c语言,接
着学c++、c#、java、汇编、vb、vc、c++ builder……,哪一种语言用多少时间去专攻等等,现在回想起
来觉得多么的可笑!只要学得精,一gate就够了。从实用的角度来讲,C++ 是最好的选择(个人意见,其实
每一种语言都很好),而VC和C++ Builder是其相应开发工具的两大主流,笔者极力推荐初学者使用C++ Builder,
因为很容易上手,如果一下子就用VC的话,也许会打击你的自信心:)。
三、谈谈促进编程能力提高的两个途径
如果你是一个黑客技术的狂热者的话,到雅虎去搜索黑客教程的时候就会发现,很多的中文教程在谈到如何
进行黑客编程时,十有[屏蔽]都会介绍以下两大最佳途径:一、读程序;二、写程序,并且都提出了教程作者的看法
,下面我想谈谈这方面的个人观点。
⒈读程序:我将读程序放在前面是有原因的。在你没有阅读过一份完整的源代码之前,你别指望能写出有多好
的程序来!这是对每一位初学者的忠告也是警告,而且必须具备一定的语言基础知识,这里的基础知识主要是指语
法知识,最起码要能读懂别人的程序的每一行意思。有没有程序的设计思想,在这个时期并不重要,只要具备一定
的语法基础就可以了,思想可以通过阅读完别人的源程序后分析得来。
记得在大一学习C语言的时候,我们都很重视语法的学习,整天都看教材、做练习,而且赶在老师的讲课前预习,
课后又复习巩固,将一些语法点记得滚瓜烂熟,可后来一到做课程设计的时候,坐在电脑面前简直是老鼠拖鸡蛋—
无从下手了,而且不断的问自己:“我平时的努力哪去了?语法都会了呀,怎么还是做不出程序来?”相信很多人
都像笔者以前那样,错误地以为学会了语法就等于掌握了编程。
编程的能力包括经验、技巧、耐心等几个因素,而并非想象中的那样简单,更不要以为编程就是简简单单的写程序!
其实学一gate语言并不需要刻意去记那些条条框框的语法,在看代码的时候,遇到了不明白的地方再去查相关的
资料,一点一点补充基础知识再配合源程序的思路,这时的理解才是最深刻的,我可以肯定地说,这个时候对语法
的接受程度绝对比你刚开始时的死记要强!
读程序也不能单纯地读,要真正做到“俯而读,昂而思”。好的代码是百读不厌的,比如Shotgun的那道构造
洪水Ping攻击的代码,我至少读了20遍。笔者喜欢将从网上搜集来的代码打印到纸上(尽管学校的打印费贵得要命
,打一份代码就得花去十几块甚至几十块大洋~~~),然后边看边做好眉批,遇到一个新函数记下它的功能,一些
忘记了的知识在旁边标出来,还可以写上对程序的看法等等。特别是遇到了一些新的API函数,最好标出来,对你
以后编程的时候也许会用得着,最后别忘了分析一下程序的思路,这样对你以后编写类似的程序很有帮助的。
⒉写程序:问题可谈到点子上了,学那么多语言,读那么多程序最终还不是为了写程序,做出适合需要的软件
来?“君子性非异也,善加于物也”,笔者认为一切从借鉴开始,先是修改别人的程序,等到有了一定的程度再写
出属于自己的程序。
刚开始写程序,不要奢望一下子写出很出色的程序来,“万丈高楼平底起”,编程贵在动手,只要你动手去写
了,就算只有一句“printf(“Hello!”);”也是一次进步!此外,还要依照自身的能力循序渐进地写,开始的时候
写一点功能简单的、篇幅短小的代码,力求简洁、完整,“麻雀虽小,但五脏俱全”,然后在此基础上进行扩充,
一点一点添加功能,下面笔者摘录一位国内一流编程高手、“豪杰超级解霸”的作者梁肇新的编程心得,请大家看
看一个成功的程序员是如何写程序的,希望对广大菜鸟有所启发:
写程序的方法:在Win98的环境中,先写主干,用最少的代码实现最基本的功能。然后一点点添加功能,每加
一点都要调试。尽量少用动态分配、全局变量。充分利用操作系统直接提供的API。在Win98下调试通过之后,再
在Win95下调试通过,然后是Win97,WindowsME,WinNT4.0。这样才能写出稳定、快速的程序。
给程序员的建议:1、不要急于求成,这样往往欲速不达。2、不要什么东西都想学,什么都没掌握。3、每天
都要自我总结,分析自己的错误率和废码率,不断加强自我管理。4、代码格式很重要。代码要规范、严谨,效率要高。
5、不要盲从简单的开发工具(这点笔者不是很同意,最起码要有一定的功底的人才敢这么说)。6、有了成果要公开,
不要舍不得,不然很快会过时的
本帖最近评分记录:
浮云:5 (by 独飞の孤心)
Posted: 2006-12-03 22:45 |
[楼 主]
快速跳至
|- 站务管理
|- 惩罚,奖励公布区
|- 会员咨询意见区
|- 申请区
|- 已批准申请区
|- 威望和荣誉会员推荐区
|- 5come5名人堂·Hall of Fame
>> 休闲娱乐
|- 灌水乐园 大杂烩
|- 精水区
|- 幽默天地
|- 开怀大笑(精华区)
|- 灵异空间
|- 运动新时空·菠菜交流
|- 动之风.漫之舞
|- 新货上架
|- 古董挖挖
|- 唯美贴图
|- 创意&美化&设计
|- 5COME5头像及签名档图片引用专区
|- 艺术摄影
|- 音乐咖啡屋
|- 音道乐经
>> 热点讨论
|- 工作交流
|- 求职信息
|- 就业精华区
|- 同城联谊
|- 留学专版
|- 情感物语
|- 情感物语精华区
|- 带走一片银杏叶
|- 精华区
|- 新闻直通车
|- 众志成城,抗震救灾
|- 衣食住行
|- 跳蚤市场
|- 旅游出行
>> 学术交流
|- 学业有成
|- 智力考场
|- 考研专版
|- 外语乐园
|- 考试·毕业设计
|- 电子设计·数学建模
|- 学生工作·社团交流·RX
|- 电脑技术
|- 电脑F.A.Q.
|- 软件交流
|- 硬件·数码
|- 程序员之家
|- Linux专区
|- 舞文弄墨
|- 历史&文化
|- 军临天下
|- 军事精华区
|- 财经频道
>> 游戏新干线[电子竞技俱乐部]
|- Blizz@rd游戏特区
|- WarCraft III
|- 魔兽区档案库
|- 魔兽争霸3博彩专区
|- StarCraft(new)
|- 暗黑专区
|- 休闲游戏区
|- PC GAME综合讨论区
|- 实况足球专区
|- Counter-Strike专区
|- TV GAME& 模拟器
|- 网络游戏
>> 资源交流
|- 恋影部落
|- 连续剧天地
|- 综艺开心档
|- 书香小筑
|- 小说发布
|- 资源交流
|- 综艺、体育、游戏资源发布
|- 音乐资源发布区
|- 电影电视剧发布区
|- 字幕园地
我来我网·5come5 Forum
»
程序员之家
Total 0.010495(s) query 6, Time now is:11-27 13:22, Gzip enabled
Powered by PHPWind v5.3, Localized by
5come5 Tech Team
,
黔ICP备16009856号