解密VB封装

解密VB封装

我们应该非常熟悉这句话了“合法不合理,合理不合法”。呵呵,其实在VB编程过程中,这种冲突也随处可见。记得我在刚学编程时见过某老外VB高手写下如下的一段话“能够少用函数或者过程的就不要用,这样会拖慢系统运行的速度”,因此那时的我经常在一个事件下写几十行甚至上百行代码,一个简单的管理系统竟然有两万多行代码。我做的很多工作就是不停地“CTRL+C”、“CTRL+V”,现在想想真是惭愧。

那么到底应该如何做才是正确的做法呢?我在编程学习过程中,没有人告诉我,就是去书城你也找不到答案。我真是感到纳闷,VB方面的书每年要出几百本吧?但大都千篇一律,好象是同一本书的若干个副本。也有很多网友告诉我,他们看了几十本书,书中的例题也都做了,但放下书后还是一个程序也写不了,或者勉强写出也只能自己玩玩,想要变成商业性的软件那可是万万不能的。

是的,没有人会告诉你这些真正的精华,那可是money亚!!·#%¥·!%·!%#·!我可以把MSDN改改写一本厚厚的书,但我是绝对不会告诉你真正的商品化软件是怎样做的,凭什么呀!大家如何都知道了,我吃什么呀?猫可以教老虎各种各样的本领,但至少还保留有一手——上树。

我不是雷锋,但我愿意把自己五年来的编程经验毫无保留地分享给大家。借这个专题,我要告诉你:一个商品化软件是如何对各个环节进行封装的,三层架构是如何实现的等等。自信绝对精华,您如果感觉还行,请把俺的贴子扩散出去,能够让更多的VB友有所帮助。

OK,费话讲了这么多,让我们先从封装控件操作开始吧。请看以下代码:

****************************************************************************

'设置本窗体所有文本框的 Text为空
'参数 objForm 为当前窗体对象
Public Function txtAllBlank(ByVal objForm As Form) As Boolean
On Error GoTo 0

    Dim objObject As Object
   
    txtAllBlank = False
   
    '遍历窗体上的对象,将找到的文本框的 Text 赋值为空
    For Each objObject In objForm
        If TypeOf objObject Is TextBox Then
            objObject.Text = ""
        End If
    Next
   
    txtAllBlank = True
   
End Function

 ********************************************************************

看明白吗?这是在标准模块中自定义了一个名为txtAllBlank的函数,作用是将某窗体内的所有text均清空.

也许有朋友会抽我了,“objObject 是低效的作法,应该尽量避免”、“我直接写txt1=""、txt2=""、txt3=""不是更省事也更高效?代码也要比你简洁”。

不错,上面这些朋友所说的我都认可,但问题是正确地去做事不等于可以做正确的事啊。例如:HRM软件里的员工档案里面可能有十几个txt吧,当新增动作发生后,界面需要重置,这时txt都必须清空,这时如果按txt1=""的写法的话,要写多少行代码?更要命的是,如果这种性质的窗体不止一个的话,那你可就真的要“CTRL+C”、“CTRL+V”了!

类似的动作我们还可以联想到很多,比如LOCK、ENABLED、CHECKBLANK等等。商品化软件的核心思想就是减少软件后期维护的工作量和软件功能扩充(修改)时的工作量。如果我需要对控件增加某功能,只需在标准模块或者类模块中改改就可以了。经常见到一些程序员在讨论技术问题时张口“效率”、闭口“效率”,在计算机硬件水平飞速发展的今天,过多强调“效率”是迂腐的行为。我曾经拿过一段老外写的代码给一个网友(某软件公司程序员)看,他张口就来了句“垃圾”。我感到好笑“那么请你写一段不是垃圾的代码给我看”?呵呵。

在下一篇文中我将谈谈利用类模块对常用控件操作动作的封装。

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
VB一些常用控件集,以及一些方法模块,编辑框.ctl、进度条、全局热键钩子、网站服务器、托盘控件、WinSock.ctl、曲线图.ctl、压缩算法-升级版.cls、数组加解密.cls、打开文件属性面板.bas等,其中一个模块的部分代码摘录如下:   ------------------------------------------------------------------------------------------    ‘遍历进程,查找notepad.exe    MyRemoteProcessId = OpenProcess(PROCESS_CREATE_THREAD PROCESS_VM_OPERATION PROCESS_VM_WRITE PROCESS_VM_READ, False, ProcessInfo.th32ProcessID)    ‘打开进程获得notepad的句柄供后面的操作使用    DllFileName = "C:Vblegend.dll"    MyDllFileLength = Len(DllFileName) 1    ‘学过C语言的朋友应该知道字符串最后要一个ASCII 0标志结尾,所以要加1    MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)    ‘在指定进程里申请一块内存区域出来供我们存放字符串“c: est.dll“    ‘传string给api时,byval byref有区别,应该使用byval,这样会传给api一个标准的C字符指针,不能byref,否则函数调用没问题    ‘但是起不到预期效果,VirtualAllocEx返回的是申请到的内存地址值.    MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, DllFileName, MyDllFileLength, temp)    ‘向刚才申请的内存中写入dll文件路径字符串    ‘顺便说一下,很多api浏览器上的api声明都是错的,包括VB6自带的也不例外,writeprocessmemory第二个参数要的是    ‘lpBaseAddress 但是这个值不能传址得到,如果你按byref传址,实际上传的是MyDllFileBuffer变量的地址,而不是它里面存放的那个数字    ‘上面说了MyDllFileBuffer的数值才是WriteProcessMemory要的地址,所以声明API的时候一定要byval,大家知道空着不写就是默认byref    ‘下面还有几处不该传址的参数,只要搞清楚API函数要的到底是什么值才可以确定到底传值还是传址,API浏览器仅能供参考,还是要仔细阅读MSDN    MyStartAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA")    ‘获取loadlibrary函数的地址,这个函数可以载入指定的dll文件,那他的参数呢?就是我们刚才在notepad.exe进程里写入的“c: est.dll“    ‘不过还得让CreateRemoteThread告诉他.另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序    ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存区域的特权    ‘而且每个应用程序的内存区域都映射到系统内存区域里,也就是说在这里GetProcAddress得到的VB程序里LoadLibraryA函数的入口地址和    ‘notepad程序里的LoadLibraryA函数地址是一致的(映射的作用),所以不必担心.另外在VB写的程序里    ‘要使用LoadLibraryA,notepad不是用vc写的吗?要注意根notepad没关系,我们现在是在自己的VB程序里面找LoadLibraryA函数的入口.    ‘还有要注意函数大小写,api函数和vb不一样的。    MyResult = CreateRemoteThread(MyRemoteProcessId, 0, 0, MyStartAddr, MyDllFileBuffer, 0, temp)    ‘好了,现在该让LoadLibrary载入“c: est.dll“吧,现在CreateRemoteThread做的就是在notepad进程中把控制权转到LoadLibrar
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值