博文

类的开发(下)(2007-01-20 12:08:00)

摘要:在Visual Basic 6.0类的技术与应用(上)(以下简称上文)中,我们讨论了类的理论、类的创建和类的方法的编程实践,实际上,类之所以能够在软件工程中广泛应用,最主要的一点是它可以非常方便的封装许多编程需要的属性,这不仅使程序员在一定程度上克服控件(ocx)和链接库(dll)设计和调试中的复杂性,而且能够提高程序代码的简洁和高效性——本文将讨论完整的类的编程,包括方法、属性和基本事件。   (一)类的属性的特征和定义;   类似于标准控件的属性,类的属性允许用户在指定的数据范围内进行赋值,这些值被类内的各个代码部分所共享。属性的获得和传递需要经过 Property Let和Property Get语句进行编程,当然,我们首先需要在类中进行全局或者模块级的相应变量定义。   (二)事件的属性和基本定义;   和窗体的事件类似,类也有两个基本的事件,Class_Initialize(类加载时触发)和Class_Terminate(类卸载时触发),这两个事件都是private的。实际上,我们完全可以忽略这两个事件——只要你记得完善类的方法和属性。   类同样可以定义自己的事件,它和方法的程序编写格式类似,只不过需要WithEvents关键字进行参数声明,而且事件不能有任何命名参数或者可选参数,它也没有返回值。   实际上,结构良好的方法和属性完全可以替代结构复杂的类的事件。   (三)类的方法、事件和属性的编程实例;   本程序的设计目的是,通过类控制窗体中文本框的内容的全部大写、小写和逆向排序转化。   为了方便代码的书写和调用,我在类中引用了枚举的编程方法。   以下代码在类Class1:   Option Explicit    Private WithEvents myTXT As TextBox    '方法的参数接口    Public Enum sTYLE     Lcaseit'小写属性     Lbigit'大写属性     Nlogoit'逆向排序属性    End Enum   '自定义枚举,用来实现属性的自动赋值   Private mvarBiaozhi As sTYLE   '实现枚举常量的连接   Public Function dONE() As String'   'DONE方法用......

阅读全文(2045) | 评论:0

关于VB类的开发(2007-01-20 11:50:00)

摘要:对程序员和编程爱好者来说,VB中类的技术是学习中的一个难点,在大型软件的开发过程中,模块(Moudle)、控件(Active ocx)、链接库(Active dll)和类(Class moudle)构成了系统化、高效化的软件工程,而类的技术是控件和链接库技术的基础,因此掌握类的理论和编程方法是非常有意义的。   (一)类的基本定义和应用概述;  
   类是包含了方法、属性、数据成员的高级代码模块,它既在模块的范畴之内,又是一个没有图形界面的Active ocx,程序员可以象使用控件一样使用它,但却不能看到它,值得注意的是,类是不能继承的。 类能够使我们高效的完成对某一个或者某几个特定的对象的复杂操作,对象的动作就是类的方法,对象的属性就是类的属性过程。相对而言,如果编程的对象是一组事物,那么,我们采用标准模块的方式是非常合适的,在下列两种情况下,应该使用类进行代码处理:     (1)创建大量性质相近的对象;   (2)提高代码的封装性。    类的创建非常简单,在进行代码编写的时候,在“工程”菜单中选择“添加类模块”项目,就可以添加一个空白的类。    类文件一般以.cls作为扩展名保存。
  (二)类的方法的实现;    类的方法类似于动态链接库的接口函数,它能够接受其他窗体代码的指定类型参数,并且传递到类中。一般来说类的方法是能够指定是否有返回值的。它在类中通常是一个public过程。请看下面的代码示例,它使一个密码框拒绝非字母的输入:   (1)类cls的代码;    Option Explicit'变量检查     Private WithEvents mytxt As TextBox     '本类中的方法接受和控制一个text密码框     Dim isNUM As Boolean     '类的模块级变量     Public Sub Attach(itTEXT As TextBox)     '接受外部变量到mytxt中     Set mytxt = itTEXT    End Sub    Private Sub mytxt_KeyUp(KeyCode As Integer, Shift As Integer)     isNUM = (KeyCode >= 65) And (Ke......

阅读全文(2163) | 评论:0

VB程序中处理随机事件(2007-01-20 11:07:00)

摘要:在程序设计过程中,如何轻松地处理众多的随机事件,往往是制作大型系统首先要考虑的问题之一。用C语言开发Windows程序时,可以方便地使用消息机制(Message),但是,设计VB程序时,就没有这样的方便条件了。例如,多个窗口同时打开同一个表(Table),当在一个窗口中对数据进行了修改,而其他的窗口也能够随之进行数据更新,这时就需要有一条说明数据改变了的消息在所有的窗口间进行广播。如果使用的语言是C,只需要定义一条用户消息(UserMessage),就可以实现这一点。可是如果是用VB编程,做起来就不是那么简单了,最初我是试着这样实现的: 自定义了一个消息结构(VbMsg),并在程序的主窗体内,建立一个消息广播引擎,主要由一个消息队列和一个定时消息广播器所组成。消息广播器固定隔一定时间检查一次消息队列,如果有消息存在,就将其发送给所有的打开的窗口,并将该消息从队列中删除。如此再定义一个全局的消息发送过程(SendMsg),将要发送的消息(VbMsg)送入消息队列。这样当需要广播消息时,只需填充好消息结构,调用SendMsg过程即可。这里较为复杂的是消息广播器如何将消息发送到各窗口:这需要作个硬性规定,就是每一个窗体都必须定义一个形式完全相同的消息接收函数(RecMsg),在这个函数中对接收到的消息进行处理,当然也可以什么都不做。有了这样的规定之后,消息广播器在进行广播时,就可以是利用VB系统定义的全局变量Forms,遍历所有的窗体,并调用一遍每个窗体的消息接收函数,其样子大致如下: Public Sub SendMsgToForms(msg as VbMsg) Dim frm as Form For Each frm In Forms frm.RecMsg msg Next frm End Sub 通过上面的这些过程,就可以实现在独立的程序中,对随机事件进行异步处理。这一方法我曾经在早期开发的几个系统中使用,效果基本还是令人满意的。但是它有几个较大的局限性,当开发更大一些的系统时,就显得不能够满足需要。主要有以下几点: 1.定时检查消息队列,需要利用Timer控件进行触发。这在程序运行时,就必然要牺牲一部分效率; 2.消息广播的范围限定在一个程序模块内,如果整个系统分成多个大的模块,那么存在于动态连接模块(.DLL)中的窗体,将不能直接接收到广播......

阅读全文(1539) | 评论:0

Rundll32.exe和Rundll.exe的区别 (2007-01-19 12:16:00)

摘要:动态链接库函数启动器——Rundll32

经常听到有些朋友说:呀!系统的注册表启动项目有rundll32.exe,系统进程也有rundll32.exe,是不是病毒呀?其实,这是对rundll32.exe接口不了解,它的原理非常简单,了解并掌握其原理对于我们平时的应用非常有用,如果能理解了原理,我们就能活学活用,自己挖掘DLL参数应用技巧。

Rundll32.exe和Rundll.exe的区别

所谓Rundll.exe,可以把它分成两部分,Run(运行)和DLL(动态数据库),所以,此程序的功能是运行那些不能作为程序单独运行的DLL文件。而Rundll32.exe则用来运行32位DLL文件。Windows 2000/XP都是NT内核系统,其代码都是纯32位的,所以在这两个系统中,就没有rundll.exe这个程序。

相反,Windows 98代码夹杂着16位和32位,所以同时具有Rundll32.exe和Rundll.exe两个程序。这就是为什么Windows 98的System文件夹为主系统文件夹,而到了Windows 2000/XP时就变成System32为主系统文件夹(这时的System文件夹是为兼容16位代码设立的)。

Rundll.exe是病毒?

无论是Rundll32.exe或Rundll.exe,独立运行都是毫无作用的,要在程序后面指定加载DLL文件。在Windows的任务管理器中,我们只能看到rundll32.exe进程,而其实质是调用的DLL。我们可以利用进程管理器等软件(本刊2004年21期有介绍)来查看它具体运行了哪些DLL文件。

有些木马是利用Rundll32.exe加载DLL形式运行的,但大多数情况下Rundll32.exe都是加载系统的DLL文件,不用太担心。另外要提起的是,有些病毒木马利用名字与系统常见进程相似或相同特点,瞒骗用户。所以,要确定所运行的Rundll32.exe是在%systemroot%system32目录下的,注意文件名称也没有变化。

相信大家在论坛上很常看见那些高手给出的一些参数来简化操作,如rundll32.exe shell32.dll,Control_RunDLL,取代了冗长的“开始→设......

阅读全文(1604) | 评论:0

Rundll32.exe浅谈(2007-01-19 12:12:00)

摘要:Rundll32.exe浅谈

Rundll32.exe是什么?顾名思意,“执行32位的DLL文件”。它的作用是执行DLL文件中的内部
函数,这样在进程当中,只会有Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。
如果看到系统中有多个Rundll32.exe,不必惊慌,这证明用Rundll32.exe启动了多少个的DLL文件。当然,
这些Rundll32.exe执行的DLL文件是什么,我们都可以从系统自动加载的地方找到。

    现在,我来介绍一下Rundll32.exe这个文件,意思上边已经说过,功能就是以命令行的方式调用动
态链接程序库。系统中还有一个Rundll.exe文件,他的意思是“执行16位的DLL文件”,这里要注意
一下。在来看看Rundll32.exe使用的函数原型:
    Void CALLBACK FunctionName (
    HWND hwnd,
    HINSTANCE hinst,
    LPTSTR lpCmdLine,
    Int nCmdShow
    );

    其命令行下的使用方法为:Rundll32.exe DLLname,Functionname [Arguments]
    DLLname为需要执行的DLL文件名;Functionname为前边需要执行的DLL文件的具体引出函数;
[Arguments]为引出函数的具体参数。

略谈Rundll32.exe的作用  (我是菜鸟)    

   

    常用Windows9x的朋友一定对Rundll32.exe和Rundll.exe这两个档案不会陌生吧,不过,由於这两个程式
......

阅读全文(2525) | 评论:0

VB编程之提升篇(2007-01-18 23:17:00)

摘要:   ● 判断空字符串    判断空字符串的常用方法是使用下面的语句:If my_string = "" Then... ,但是请采用另外一种方法,就是判断字符串的长度是否为0,这要比前者运行快,代码是: If Len(my_string) = 0 Then ... 。    ● 使用With命令引用多次使用的对象    这要比在每条语句中都完整地引用对象名称执行速度快许多!    ● 少有字符串操作函数    尽可能少地使用字符串操作函数,它们运行很慢。    ● 定制Select Case语句    Select Case是处理多重条件判断的语句,请将经常要用到的选择排列在前面的选项,以增加该选项提前被选择命中的机会。    ● 尽可能的使用by ref参数调用函数和子程序    ● 将从不需要的表单设置为nothing    如果有许多要标明的表单,采用这个策略,将节省内存并减少运行时间。如果只有少数几个表单,请将它们全部装载进内存并隐藏之,这样将在随后的使用中速度更快。    ● 预想一下程序的速度    对程序的运行速度进行想象是非常重要的,设想一下点击按钮后,等待10秒钟。这将是一个非常长的时间!请添加一个进程条显示程序的进展情况,用户就不会感到等待。    ● 使用mid$函数而不是mid    如果需要执行许多字符串/文件操作,请使用mid$(以及trim$等等)函数而不是mid。因为后者将数据类型看作是variant 而不是 string,速度将慢3倍。    ● 尽快显示启动表单    尽快地显示启动表单可以使程序看起来很快。在表单的Load事件中使用Show命令,从而在执行长时间的启动计算工作前就能显示出程序界面。    ● 尽可能地在Form_Load事件中放置少量的代码    ● 使用splash技术过渡中间操作    如果初始化的表单要运行很长时间,请先立即显示一个splash画面,然后在初始表单完全装载后,再去除它。关于如果创建不同种类splash画面的资料,请查阅Advanced Visual Basic Techniques。    ● 在模块中将子程序分组    当一个程序调用另外一个程序时,另外的程序所在的模块将被装载。如果一个程序需要调用多个不同模块中的程序,那么所有的这些模块都要被装......

阅读全文(1651) | 评论:0

VB编程优良习惯(补充版)(2007-01-18 23:08:00)

摘要:用程序频繁使用许多菜单控件,对于这些控件具备一组唯一的命名约定很实用。除了最前面 "mnu" 标记以外,菜单控件的前缀应该被扩展:对每一级嵌套增加一个附加前缀,将最终的菜单的标题放在名称字符串的最后。下表列出了一些例子。 推荐使用的菜单前缀
菜单标题序列 菜单处理器名称
File Open mnuFileOpen
File Send Email mnuFileSendEmail
File Send Fax mnuFileSendFax
Format Character mnuFormatCharacter
Help Contents mnuHelpContents 当使用这种命名约定时,一个特定的菜单组的所有成员一个接一个地列在 Visual Basic 的“属性”窗口中。而且,菜单控件的名字清楚地表示出它们所属的菜单项。 为其它控件选择前缀 对于上面没有列出的控件,应该用唯一的由两个或三个字符组成的前缀使它们标准化,以保持一致性。只有当需要澄清时,才使用多于三个字符的前缀。 常量和变量命名约定
除了对象之外,常量和变量也需要良好格式的命名约定。本节列出了 Visual Basic 支持的常量和变量的推荐约定。并且讨论标识数据类型和范围的问题。 变量应该总是被定义在尽可能小的范围内。全局 (Public) 变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。全局变量也使代码的重用和维护更加困难。 Visual Basic 中的变量可以有下列范围

范围 声明位置 可见位置
过程级 过程,子过程或函数过程中的 ‘Private’ 在声明它的过程中
模块级 窗体或代码模块(.frm、.bas )的声明部分中的 ‘Private’ 窗体或代码模块中的每一个过程
全局 代码模块(.bas)的声明部分中的 ‘Public’ 应用程序中的每一处 在 Visual Basic 的应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。给这个模块取一个有意义的名称,以指明它的作用,如 Public.bas。 较好的编码习惯是尽可能写模块化的代码。例如,如果应用程序显示一个对话框,......

阅读全文(1691) | 评论:0

VB编程优良习惯(下)(2007-01-18 23:06:00)

摘要: Image combo imgcbo imgcboProduct ImageList ils ilsAllIcons Label lbl lblHelpMessage Lightweight check box lwchk lwchkArchive Lightweight combo box lwcbo lwcboGerman Lightweight command button lwcmd lwcmdRemove Lightweight frame lwfra lwfraSaveOptions Lightweight horizontal scroll bar lwhsb lwhsbVolume Lightweight list box lwlst lwlstCostCenters Lightweight option button lwopt lwoptIncomeLevel Lightweight text box lwtxt lwoptStreet Lightweight vertical scroll bar lwvsb lwvsbYear Line lin linVertical List box lst lstPolicyCodes ListView lvw lvwHeadings MAPI message mpm mpmSentMessage MAPI session mps mpsSession MCI mci mciVideo Menu mnu mnuFileOpen Month view mvw mvwPeriod MS Chart ch chSalesbyRegion MS Flex grid msg msgClients MS Tab mst ......

阅读全文(1768) | 评论:0

VB编程的优良习惯(中)(2007-01-18 23:05:00)

摘要:   推荐使用的控件前缀 控件类型 前缀 例子 3D Panel pnl pnlGroup ADO Data ado adoBiblio Animated button ani aniMailBox Check box chk chkReadOnly Combo box, drop-down list box cbo cboEnglish Command button cmd cmdExit Common dialog dlg dlgFileOpen Communications com comFax Control ctr ctrCurrent Data dat datBiblio Data-bound combo box dbcbo dbcboLanguage Data-bound grid dbgrd dbgrdQueryResult Data-bound list box dblst dblstJobType Data combo dbc dbcAuthor Data grid dgd dgdTitles Data list dbl dblPublisher Data repeater drp drpLocation Date picker dtp dtpPublished Directory list box dir dirSource Drive list box drv drvTarget File list box fil filSource Flat scroll bar fsb fsbMove Form frm frmEntry Frame fra fraLanguage ......

阅读全文(2230) | 评论:0

VB编程的优良习惯(上)(2007-01-18 22:59:00)

摘要:1、"&"替换"+" 2、变量命名大小写,语句错落有秩,源代码维护方面
3、请养成以下的“对象命名约定”良好习惯 4、在简单的选择条件情况下,使用IIf()函数
5、尽量使用Debug.Print进行调试 6、在重复对某一对象的属性进行修改时,尽量使用With....End With
7、MsgBox中尽量使用消息图标,这样程序比较有规范 8、在可能的情况下使用枚举 1、"&"替换"+"
在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。良好的习惯是用“&”来连接字符串. 不正确:
Dim sMessage As String
sMessage = "1" + "2" 正确:
Dim sMessage As String
sMessage = "1" & "2" 注意:"&"的后面有个空格 2、变量命名大小写,语句错落有秩,源代码维护方面 下面大家比较一下以下两段代码: 读懂难度很大的代码: Dim SNAME As String
Dim NTURN As Integer If NTURN = 0 Then
If SNAME = "vbeden" Then
Do While NTURN < 4
NTURN = NTURN + 1
Loop
End If
End If 容易读懂的代码: Dim sName As String
Dim nTurn As Integer If nTurn = 0 Then
If sName = "vbeden" Then
Do While nTurn < 4
nTurn = nTurn + 1
Loop
End If
End If......

阅读全文(2154) | 评论:0