易语言Windows开发从入门到死亡:第一章
易语言Windows开发从入门到死亡我们先从一个小程序.来进入windows编程的大门先用易语言创建一个windows窗口程序然后我们添加一条DLL命令.DLL命令.我们填写CG_消息框(CG_前缀是为了区别或者美观.可以自行修改)库文件名.填写User32在库中对应名.填写Messagebox然后添加4个参数分别为整数型.文本型.文本型.整数型然后.我们调用他OK.我们已经打开了windows编程的大门.下面我们开始讲解首先.是易语言的DLL命令其实.他就是一个LoadLibrary.他将显式(或隐式)载入一个DLL.然后获取其函数地址,最后调用.这里不做过多解析DLL命令名:这个很好理解.也就是你给这个函数起一个名字~你想起什么起什么.比如萨达姆大战变形金刚.都可以,不过我还是推荐代码规范化.库文件名:这个地方需要注意一下.一开始.我填User32.dll居然报错了.我去掉.dll就可以了.目测是以下3个DLL不需要添加后缀. Kernel32.dll,User32.dll和GDI32.dll.未验证.因为这点不是很重要.在库中对应函数名:这个地方就是真正填我们的win32API函数名的地方了.这个地方千万不要填错.填错那就胡扯了.还有一些函数.有A和W之分.这个我们以后再说,不太重要.这里我填的A接下来是参数我定义了4个参数.类型分别为整数型.文本型.文本型.和整数型.这个我们暂时忽略,不用去管他.我们重点不是研究这个函数都有哪些参数.填什么数据类型.我要教的是一种方法.授人以鱼不如授人以渔.咱们先把易语言IDE提供的这张”表”研究清楚~这个备注和数组不用我讲了吧?哦,你就是需要我讲.我也不会讲的.听不懂拉倒吧公开.这个东西我还真没研究过.在DLL命令中我从未公开过任何函数,个人推测是编写模块的时候.给模块使用者用的吧传址:这个讲起来就比较麻烦了.易语言本身并没有提供什么对于指针的操作.虽然很多模块.支持库,都多多少少提供了指针.个人认为,易语言在设计之初就应该开放指针.虽然易语言设计之初就是一个易字.但是你这边不让用.这边又来个传址.初学者一会就懵逼了.好吧,扯回正题.一段简单易懂不带语言的段落“这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。”如果不懂.可以自行百度一下指针,还不懂.没事,大概懂了就行了.要求不能太高…不然观众该不高兴了.你只需要记住.勾选之后.不传递该变量的值.而是传递该变量的指针出去即可.在调用WIN32API的时候.需要你传址.你勾选一下即可.不懂问题好像也不大好了.易语言的DLL命令解释完了.咱们不急着开始讲这个函数.因为大头还没说呢!win32api还没给你们解释呢!什么?开头为啥不说?卧槽.你给我一篇教程,开头给老子讲一大堆听不懂的东西.老子也不愿意听啊.不给你们先实现一下的机会,你们哪来的兴趣继续学习呢?很多人不愿意学C/C++ 不就是因为学了半天还在那个小黑框框里面连个窗口都看不见么?当年C不就是因为3行代码输出helloworld风靡全球开始了大航海.不,大编程时代么?
好了不扯了.开始正式介绍大佬登场:使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在WindowsNT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。就这么多.至于细节.自行百度.我管你那么多历史和发展历程.我不听!顺便补充一句.你们都叫他win32api甚至更加不严谨的直接统称API.这是错误的.API的全称为API(ApplicationProgramming Interface,应用程序编程接口).而目前大部分机器已经是64了.为什么还叫WIN32API?不是WIN64了?实际上.win16api是存在的.他就叫win16.但是win64还是win32api.因为其64位系统和32为系统在功能方面并没有差别.然后是函数(function)和方法(method).其实他们是一个东西.只不过是叫法不同.如果真的要说有区别.我认为是面向过程为函数.面向对象为方法.如果真的要深入这个问题的话.那我只能说:老子就愿意叫他函数.你不服咬死我啊!说了这么多.咱们得开始介绍我们刚刚所写的函数了我只吹两点.1. XX百科.足够权威性2. MSDN.官方文档如果不够准确.还咱还是别开公司了.盖子你还是回去上大学吧.开啥公司啊?XX百科中.一般常用函数都有其翻译和使用方法.部分函数还会有易语言例子.如果不常用….那么就搜索函数名吧.搜索不到.上MSDN.MSDN都没有的话…可能未文档化.也可能是这个函数不存在我本想第一课.咱们就百科算了.但是回头一想.还是不行.必须MSDN先看看百科的介绍MessageBox显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。再看看参数列表. 先看第一个参数hWnd:此参数代表消息框拥有的窗口。如果为NULL,则消息框没有拥有窗口。这个地方我一般都直接填0.至于为什么.待会细说lpText:消息框的内容。如果使用了Unicode库,则把文本变成:TEXT(/*sometext*/)Unicode待会再扯.说白了.就是消息框的内容别~lpCaption:消息框的标题。如果使用了Unicode库,则把文本变成:TEXT(/*sometext*/)这不就是标题么?uType:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。指定下列标志中的一个来显示消息框中的按钮以及图标。
本帖最后由 章鱼C 于 2016-11-26 01:16 编辑
这个参数.咱们就得先回到一下易语言系统支持库的消息框函数了在对话框中显示信息,等待用户单击按钮,并返回一个整数告诉用户单击哪一个按钮。该整数为以下常量值之一:0、#确认钮;1、#取消钮;2、#放弃钮;3、#重试钮;4、#忽略钮;5、#是钮;6、#否钮。如果对话框有“取消”按钮,则按下ESC 键与单击“取消”按钮的效果相同。本命令为初级命令。然后我们再看看这个参数所提供的参数对照一下看看.是不是一样的?那么问题又来了.这些个MB_OK,YESNO这些懵逼类型又是个啥?这…其实是C种的宏定义…#define MB_OK 0x00000000L#define MB_OKCANCEL 0x00000001L#define MB_ABORTRETRYIGNORE 0x00000002L#define MB_YESNOCANCEL 0x00000003L#define MB_YESNO 0x00000004L#define MB_RETRYCANCEL 0x00000005L这里必须扯一点题外话.那就是你最好下载一个VS2010~2015.你只需要引入windows.h头文件.然后在你不知道宏定义到底是什么的时候.你右键单击一下.之后查看定义即可.其次是Spy++和错误查询这些小工具.虽然在MSDN你也能查到这些宏定义.但是我认为直接查看头文件更加方便.随你便了.补充:千万不要用VC++6.0我懂.小甲鱼的C/C++视频用VC++6.0.可是VC++6.0已经严重过时.你们都觉得VC++6.0是微软的产物吧?我告诉你们真相!真正的历史!VC++6.0和MFC并不是微软所创作的.而是出自十六世纪文艺复兴时期的画家(暂且称为画家)列昂纳多.达芬奇只手.MFC和VC++6.0经历了文艺复兴,工业革命.甚至第一次,第二次世界大战.如今,MFC和VC++6.0却被微软翻了出来.占为己有!这种东西已经严重过时.应该随着德意志永远的消失在历史的长河之中!!!这里可以看到MB_OK是0x00000000L这是一个十六进制整数那好说啊.他写几.咱们就写几.你最大的数不过是5.你写5,老子也写5.你16进制再怎么转换.5还是5.如果超过5了.拿出你的计算器.十六转十.OK,大功告成(或者去掉0x,然后用某些模块中的命令.十六转十)要讲的东西很多.不过咱们先动手再说.管他那么多这里我们修改第一个和第四个参数.因为第二和第三没啥改头CG_消息框 (_启动窗口.取窗口句柄(), “消息框内容”,“消息框标题”,3)跑一下试试OK.大功告成
这个时候再来回头继续说这个函数首先先查查MSDNMSDN给出了一段标准C++(C)的函数定义我们只关注部分内容函数类型说明这个函数说明的还是很全的.比如…图标都给你显示出来了.继续往下看这里是我们需要重点关注的地方XX百科并没有告诉我们函数属于哪个DLL前面的我们可以不管.但是最后两行一定注意倒数第二行DLL.告诉了我们这个函数属于哪个DLL最后一行.说明了函数的ASCII和UNICODE版本分别是什么顺便科普一下windows动态链接库 内容来自MSDN对于“适用于”一节中列出的 Microsoft Windows 操作系统,操作系统的大量功能是由动态链接库(DLL) 提供的。另外,当您在这些Windows 操作系统之一上运行某一程序时,该程序的很多功能可能是由DLL 提供的。例如,某些程序可能包含很多不同的模块,而该程序的每个模块都包含在DLL 中并从中分发。使用 DLL 有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间。因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。当程序使用 DLL 时,一个称为依赖性的问题可能导致该程序无法运行。当程序使用DLL 时,就会创建一个依赖项。如果其他程序改写和损坏了该依赖项,原来的那个程序就可能无法成功运行。在引入 Microsoft .NET Framework 之后,大多数依赖性问题都已经通过使用程序集消除了。最后一句广告打得真TM不要脸.呸…C#你个渣渣(好吧.语言都是一样的.每种语言都有自己的优点…..(老子才不信这一套))第一个参数.我填的是_启动窗口.取窗口句柄().这里应该是填一个窗口句柄.但是我填123456.也能正常运行.只不过消息框弹不出来了==.但是他还能跑.这你就不能说我写的有问题.能跑就是正义这里得扯点题外话.在调用win32api的时候.有很多情况下.你没必要一定要去了解所有参数!.我认识一个女的,做驱动开发的.她非要抓着老子问ObRegisterCallbacks.这个函数所有的参数.结构体的具体作用.我就跟他说.很多情况下.我们是不需要了解部分参数的用途的.你只需要知道填什么就好.她就非要扯什么不知道参数意义我就不会用.MD,老子要是知道我就给你讲了.还需要跟你这绕来绕去?关键是老子不知道啊,但是我又不能说我不会.B都装出去了.还有收回来的道理?这个Version参数.MSDN都才讲了一句话.你指望我能给你吐出什么大学问来?这里我要告诉各位,很多情况下.很多函数的具体参数.我们是无需了解其作用的.只需要知道一般情况下填什么即可.比如很多参数都是填0就可以了.还有一些参数他是windows保留字段.他不需要你填.更有些参数MSDN都未公开(或未文档化).我哪里知道啊?我又没有那群B的逆向水平.
我其实刚准备说.甚至windows核心编程一书中.都会说”我们只关心这几个函数”但是怕说错挨喷.我又去翻了一遍.卧槽!居然没有.我记得是在进程中?没有.那I/O?卧槽也没有,好吧.我印象中是有的.如果没有.那C++黑客编程那本书中.绝B有.在书中你都可以见到类似”我们只关心某些函数”的话语.说明很多参数.我们的确不需要了解.这也就是为什么,那么多win32api.却只有少部分被中文翻译了.因为很多函数,我们一般是用不到的再来说说Unicode关于ASCII和Unicode.这个问题要说起来.那就麻烦了…因为我没那么能力去讲这个东西.后面我要说的什么进程啊线程啊.特别是线程同步.还有内核对象,其实我都讲不来.因为太难讲清楚而且.这个问题,其实易语言使用者不用担心,告诉你们一个万能的方法.那就是有双版本的函数.也就是后面带A(ASCII)和W(Unicode)的函数(比如MessageBoxA和MessageBoxW)一律用A搞定~如果某函数非要使用Unicode字符串…用到的时候再说,咱这不是还没用到么~其实winhttp就必须Unicode字符串.不过win提供了宽窄转换的函数.以后我会具体介绍的.你们可以先查查ASCII和Unicode字符串的区别.做个预习.好了.这章到此就结束了一个函数老子大笔一挥.洋洋洒洒的写了一大堆废话,其实是为了做铺垫.如果我上来就跟你扯数据类型.再跟你讲一大堆函数和参数.我认为一般人反而会受不了.循循渐进效果更好我的教程风格 也就是这样了.在我个人认为之下,不重要的.尽量不扯,一定要说清楚的.那么就一定会解释清楚.超出能力范围的,直接抱大腿或者原封不动的抄书.无法肯定的.我会提前说明.每一篇教程.都应该秉着严谨的态度来做.否则误人子弟.最后.不喜欢的没求你看OK?你TM赶紧点了关闭然后爱上哪上哪去吧有疏漏或错误可以直接在帖子中指出.考察通过之后.重新编辑!PS:别催更…我又不是网络小说写手.你催我也憋不出来半个字啊!
我要升级看页游实战!!!
页:
[1]